从visual c ++调用delphi dll

时间:2014-01-26 20:02:44

标签: c++ visual-studio-2010 delphi dll

我有在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 ;
}

1 个答案:

答案 0 :(得分:4)

首先,我建议您停止使用tchar.h_T等。当您需要为Windows 98编译时这很有用。但它是2014年,肯定会忘记Windows 98存在。因此,请编译UNICODE的应用程序,并使用L"..."进行宽文字。

当然,GetProcAddress只接收8位文本。所以你当前的代码是不正确的。您不得将_T("...")用于GetProcAddress的函数名称参数。 documentation表明了这一点。

由于您的代码编译,因此您必须编译ANSI或MBCS。如果GetProcAddress返回NULL,那么很明显DLL不会导出具有您提供的名称的函数。一些可能的原因:

  1. 您没有导出该功能。
  2. 您导出了该功能但未按该名称导出。请注意,虽然Delphi不区分大小写,但DLL函数导入/导出区分大小写。您可能导出了Foo而不是foo
  3. 一个简单的DLL,可以处理你问题中的代码:

    library MyDLL;
    
    function foo(a, b: Integer): Integer; stdcall;
    begin
      Result := a + b;
    end;
    
    exports
      foo;
    
    end.
    

    请注意,简单的.def文件在这里并不相关。 Delphi不使用.def文件。呼叫惯例也不相关。 Delphi用于导出函数的名称不受调用约定的影响。