将函数名称从C ++ Dll导出到Delphi

时间:2017-02-06 21:44:59

标签: c++ delphi dll

我有一个使用Visual Studio 2015用C ++编写的工作DLL。它包含许多形式的函数:

BECALIBRARY_API  int Functions::GetVersion(char* ptrVersionString)
{
    char * Version;
    Version = "Test 123456";
    strcpy_s(ptrVersionString, strlen(Version) + 1, Version);
    return  strlen(Version);
}

检索它的Delphi函数是:

unit uBecaLibrary;

interface

function getVersion(Str1: pAnsichar): integer; stdCall;

implementation

function getVersion; external 'BecaLibrary.dll' index 1;
//function getVersion; external 'BecaLibrary.dll' name 'getVersion';

end.

除了我必须使用DLL的索引号维护Delphi代码之外,这很好。

我需要对C ++端和Delphi Seattle Windows 10端做什么才能使用函数名而不是索引。

2 个答案:

答案 0 :(得分:3)

您可以使用dumpbin实用程序将导出的名称视为

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\dumpbin.exe" /EXPORTS BecaLibrary.dll

名称可能会被破坏但不应该是一个问题。

如果您可以更改DLL,可以在函数体内添加以下内容以导出未编码的名称

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

答案 1 :(得分:0)

你可以像上面这样使用函数名

var
function getVersion(Str1: pAnsichar): integer; stdCall; external 'BecaLibrary.dll' name 'GetVersion';

implementation

对于DLL

要导出未修饰的名称,可以使用模块定义(.def)文件进行链接,该文件在EXPORTS部分中定义未修饰的名称。有关更多信息,请参阅EXPORTS。导出未修饰名称的另一种方法是在源代码中使用
#pragma comment(linker, "/export:alias=decorated_name")
指令。

声明dllexport或dllimport时,必须使用扩展属性语法和__declspec关键字。
资料来源:https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx