我有在Delphi中编译的DLL文件,函数导出为__stdcall,以及函数说明txt文件。我没有任何源代码。
我会在visual studio c ++项目中使用这个DLL。 Google表示需要使用LoadLibrary + GetProcAddress
,但如果导出的函数声明为__stdcall,则GetProcAddress会返回NULL,即我无法使用其名称调用函数。其他人推荐使用.def文件,
但我不知道.def文件是什么,以及生成.def文件需要什么,如果我能用这种方式处理我的情况,请详细描述。
问答:如何调用这些导出的函数?
这里我发布了我的main.cpp文件,专门更改了dll名称和函数名称。
#include <Windows.h>
#include <tchar.h>
#include <cassert>
#include <cstdio>
int main()
{
//foo(80, 127);
HMODULE hLib;
hLib = LoadLibrary( _T("MyDLL.dll") );
assert(hLib != NULL ); // pass !!
int ( __stdcall *pFoo)(int, int);
(FARPROC &)pFoo = GetProcAddress(hLib, _T("foo") );
if (pFoo== NULL )
{
DWORD errc = GetLastError();
printf("%u\n",errc); // it gets error 127
}else{
printf("success load\n");
}
// pFoo(04,1);
FreeLibrary(hLib);
return 0 ;
}
答案 0 :(得分:4)
首先,我建议您停止使用tchar.h
,_T
等。当您需要为Windows 98编译时这很有用。但它是2014年,肯定会忘记Windows 98存在。因此,请编译UNICODE
的应用程序,并使用L"..."
进行宽文字。
当然,GetProcAddress
只接收8位文本。所以你当前的代码是不正确的。您不得将_T("...")
用于GetProcAddress
的函数名称参数。 documentation表明了这一点。
由于您的代码编译,因此您必须编译ANSI或MBCS。如果GetProcAddress
返回NULL
,那么很明显DLL不会导出具有您提供的名称的函数。一些可能的原因:
Foo
而不是foo
。一个简单的DLL,可以处理你问题中的代码:
library MyDLL;
function foo(a, b: Integer): Integer; stdcall;
begin
Result := a + b;
end;
exports
foo;
end.
请注意,简单的.def文件在这里并不相关。 Delphi不使用.def文件。呼叫惯例也不相关。 Delphi用于导出函数的名称不受调用约定的影响。