【发布时间】:2010-06-10 17:24:20
【问题描述】:
如何从 DLL 调用函数?
我试图声明一个 void 指针并将 GetProcAddress 的结果存储在其中......但没有奏效。我还想声明一个unsigned long int(我在互联网上的某个地方看到过),但后来我不知道如何继续。 :D
那么,有人介意帮我一把吗?
【问题讨论】:
如何从 DLL 调用函数?
我试图声明一个 void 指针并将 GetProcAddress 的结果存储在其中......但没有奏效。我还想声明一个unsigned long int(我在互联网上的某个地方看到过),但后来我不知道如何继续。 :D
那么,有人介意帮我一把吗?
【问题讨论】:
试试这样的。
typedef int (*PFuncMethods)( int args );
hDLL = LoadLibrary(L"your.dll");
if( !m_hDLL )
return;
methods = (PFuncMethods)GetProcAddress(hDLL,"methods");
if ( !(methods) ) {
FreeLibrary(hDLL);
hDLL = NULL;
methods = NULL;
return;
}
if( methods(1) == 0) ...
方法名称也是你可能会被卡住的地方。 C++ 具有用于重载的名称修饰(即使它没有重载),这取决于编译器。您可以使用extern "C" 计算出重整名称或关闭函数的重整。您可以使用depends.exe 之类的工具来查看所有必须使用的具有确切名称的函数。
在 windows 中使用 (import)lib 文件静态链接到 DLL 要容易得多。
【讨论】:
您必须创建一个函数指针而不是 void 指针,并将结果存储在来自 GetProcAddress 的函数指针中。
【讨论】:
您需要有准确的函数签名,并正确地转换指针。
例如,如果这是一个接收 int 并返回 void 的函数:
typedef void (*funcptr)(int);
funcptr func = (funcptr)(void*)GetProcAddress(....)
func(17);
注意1:如果您混淆了签名,可能会发生非常糟糕的事情。 注意2:您还需要知道使用的调用约定(cdecl、stdcall 等)
如果是您的 DLL,最好考虑创建一个导入库。
【讨论】: