从C调用系统C ++函数

时间:2014-07-03 12:51:29

标签: c++ c

我有一个C库,我实际上不允许以实质性的方式进行修改,它大量使用random函数,这在我的Visual Studio 2010编译器中是不可用的(参见{{3 }})

所以,我必须编写自己的random方法。我尝试使用一个简单的random() { srand(time(NULL)); return rand(); },但图书馆的主要概念并不喜欢它(他在Mac上,我认为他并不关心我的问题)。他告诉我在运行库时只运行一次srand(),但由于这个库中可能有多个入口点,我不知道该怎么做。如果您有问题的解决方案,我全心全意。

更新:我发现" main"函数总是在加载库时运行(根据我的理解),所以我将它用于播种。但是我仍然对这个特定问题的解决方案感兴趣 更新2 :好吧,从main()调用srand()会产生相同的结果,因此毕竟不是答案:(

所以我决定跟随生成随机数的another one of my questions

#include <Windows.h>
#include <wincrypt.h>
long int random() {
    HCRYPTPROV prov;
    if (CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, 0)) {
        long int li = 0;
        if (CryptGenRandom(prov, sizeof(li), (BYTE *)&li)) {
            return li;
        } else {
            // random number not generated
            return 0;
        }

        if (!CryptReleaseContext(prov, 0)) {
            // context not released
            return 0;
        }
    } else {
        // context not created
        return 0;
    }
}

但后来我遇到了这样的错误:

  

错误LNK2019:未解析的外部符号__imp__CryptReleaseContext @ 8   在函数_random

中引用

如果我理解正确,问题在于我从C调用C ++函数,并且C不理解在C ++编译期间发生的名称错误。

我已经访问过another method从C调用C ++,但我没有看到从C方法调用系统 C ++函数的方法。有没有我错过的东西?

谢谢!

1 个答案:

答案 0 :(得分:3)

您的问题似乎是其他问题:您必须与Advapi32.lib关联才能使用CryptReleaseContext功能。

这样做:

Right click your project -> Properties -> Linker -> Input -> Additional Dependencies

确保Advapi32.lib位于分号分隔列表中 - 否则将其添加到那里并重建项目。然后,您的链接器应该可以解析符号__imp__CryptReleaseContext