我有一个使用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端做什么才能使用函数名而不是索引。
答案 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