从C++;Delphi的动态链接库 我有一个用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); }

从C++;Delphi的动态链接库 我有一个用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); },c++,delphi,dll,C++,Delphi,Dll,用于检索此信息的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';

用于检索此信息的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西雅图Windows 10侧,我需要做什么来使用函数名而不是索引?< /P> < P>可以使用<代码> Duppin < /CultUp>查看导出的名称为

“C:\ProgramFiles(x86)\Microsoft Visual Studio 14.0\VC\bin\dumpbin.exe”/EXPORTS BecaLibrary.dll

名字可能会被弄乱,但这不应该是个问题

若可以更改DLL,可以在函数体内部添加以下内容以导出未混合的名称

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

您可以像这样在最后使用函数名

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

implementation
对于DLL

要导出未修饰的名称,可以使用模块定义(.def)文件进行链接,该文件在
EXPORTS
部分中定义未修饰的名称。有关详细信息,请参见导出。导出未修饰名称的另一种方法是在源代码中使用
#pragma注释(链接器,“/export:alias=decorded_name”)

指令

声明dllexport或dllimport时,必须使用扩展属性语法和_declspec关键字

来源:

有一种生成损坏名称的算法。IIRC它们包含参数的字节数,但我已经很久没有研究过了。是的,这确实有效。对getVersion的简单调用的损坏名称变为;函数getVersion;外部'BecaLibrary.dll'名称'?GetVersion@Functions@BecaLibrary@@SAHPAD@Z'; 我称使用LabCabeRoC+C++创建的DLL,它们不会被损坏。是否有方法阻止Visual Studio执行此操作?您可以在函数体中添加以下内容,以导出似乎不起作用的未混合名称#pragma注释(链接器“/export:“function”=“FUNCDNAME”)。名称已导出,但已损坏。“GetVersion”的名称变为:'?GetVersion@Functions@BecaLibrary@@SAHPAD@Z';如果这不起作用,我认为您需要导出/公开不同的函数