2014-01-26 176 views
1

我有Delphi中编译的DLL文件,函数导出为__stdcall,函数描述txt文件。我没有任何源代码。从Visual C++调用delphi dll

我将在visual studio C++项目中使用这个DLL。谷歌表示需要使用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 ; 
} 

回答

4

首先,我建议你停止使用tchar.h_T等。这时候,你需要编译的是Windows 98是有用的,但它是2014年和你一定可以忘记Windows 98中曾经存在过。因此请编辑UNICODE的应用程序,并使用L"..."作为宽字面值。

当然,GetProcAddress只接收8位文本。所以你当前的代码是不正确的。功能名称参数GetProcAddress不能使用_T("...")documentation说得很清楚。

由于您的代码编译它必须是您正在编译为ANSI或MBCS。并且如果GetProcAddress返回NULL那么显然DLL不会以您提供的名称导出函数。一些可能的原因:

  1. 您没有导出该功能。
  2. 您导出的功能,但不是通过该名称。请注意,尽管Delphi不区分大小写,但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用于导出函数的名称不受调用约定的影响。