This question already has answers here:
Exporting functions from a DLL with dllexport

(4个答案)


2年前关闭。




我在动态库中有一个功能,如下所示:
namespace Dll {
    int MyDll::getQ() {
        srand(time(0));
        int q = rand();
        while (!isPrime(q) || q < 100) {
            q = rand();
        }
        return q;
    }
}

.h文件中的功能getQ():
#ifdef _EXPORT
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

namespace Dll
{
    class MyDll
    {
    public:
        static DLL_EXPORT int __stdcall getQ();
    }
}

最后,LoadLibrary从另一个consoleApp获得代码和平:
typedef int(__stdcall *CUSTOM_FUNCTION)();
int main()
{

    HINSTANCE hinstance;
    CUSTOM_FUNCTION proccAddress;
    BOOL freeLibrarySuccess;
    BOOL proccAddressSuccess = FALSE;
    int result;

    hinstance = LoadLibrary(TEXT("Dll.dll"));
    if (hinstance != NULL)
    {
        proccAddress = (CUSTOM_FUNCTION)GetProcAddress(hinstance, "getQ");
        if (proccAddress != NULL)
        {
            proccAddressSuccess = TRUE;
            result = (*proccAddress)();
            printf("function called\n");
            printf("%d", result);
        }
        freeLibrarySuccess = FreeLibrary(hinstance);
    }

    if (!hinstance)
        printf("Unable to call the dll\n");

    if (!proccAddressSuccess)
        printf("Unable to call the function\n");
}

因此,我尝试多次修复此问题,但始终收到“无法调用该函数”的信息。代码连接到库,因此问题出在函数附近。
如果有人指出我的错误,我将不胜感激。

最佳答案

您缺少Extern "C"

如果不这样做,名称将被c++修饰,并且仅使用getQ名称就找不到它们。另外,这样做将不可靠,因为名称修改可能会更改。

另一个主题在这里:_stdcall vs _cdecl

07-26 04:59