在Delphi应用程序中调用C++DLL
Call C++ DLL in Delphi app
我想在我的Delphi应用程序中调用C++DLL的一个函数
问题是我遇到了访问违规。但不是在调用我的C++DLL时,而是在我离开Delphi函数时。
错误消息(缩短(:
0x7445c9f1处的访问冲突:从地址0x00000000读取。
我的C++方法是这样的:
extern "C" __stdcall void SetName(LPCTSTR name) {strcpy_s(nameInDll,512,name);};
我的Delphi调用如下:
begin
...
hDll := LoadLibrary('myCpp.dll');
SetName := getprocaddress(hDll, 'SetName');
SetName(pchar(myControl.text)); // <--- exception NOT here
...
end; // <--- exception here
有趣的是,如果我使用硬编码文本作为DLL调用的输入,它就会工作,如下所示:
SetName(pchar('myName'));
编辑:
我错过了C++DLL中的__stdcall定义。它是在宏中定义的。我更正了上面的C++方法定义。
在看到这些和你的提示后,我想出了一个有效的解决方案:
procedure SetName(s: PChar); stdcall; external 'myCpp.dll';
begin
...
SetName(pchar(myControl.text));
...
end;
听起来SetName
使用了错误的调用约定,请尝试使用cdecl;
类似这样的东西:
var
SetName : procedure(nameArg: PChar); cdecl;
否则你的堆栈会被弄乱。
DLL是为Ansi还是Unicode编译的?当定义了UNICODE
时,LPCTSTR
映射到wchar_t*
,否则映射到char*
。这会影响在Delphi中使用DLL的方式,其中wchar_t*
等同于PWideChar
,char*
等同于Delphi中的PAnsiChar
。
根据您的工作量,在编译器选项中您可能需要设置:
minimum enum size: double word
record field alignment: quad word
相关文章:
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 在 NodeJS 异步调用C++ DLL
- 从C#调用C++dll引发SEHException
- 为什么在调用C#DLL时不需要提供字符串缓冲区
- 从Delphi调用C++DLL时发生访问冲突
- 从 Python 调用 Windows DLL 函数时出错
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- 从Excel VBA调用C++DLL只能从Visual Studio中的调试实例工作
- 从 JNI 调用的 DLL 从哪里获取其内存以进行分配,例如 Malloc
- 使用指针调用C++ DLL 函数
- 如何从 UWP 应用调用"libheif.dll"函数
- 从C++调用 Delphi DLL 函数
- 在C#代码中调用C DLL
- 从C#调用C DLL方法
- 是否可以使用 Excel::_Application::Run 调用 C# dll 方法
- 从C++调用 Delphi DLL IStream 参数的问题
- 在 C# 中调用C++ DLL 库中导出的函数
- 内存损坏从vb.net调用c dll
- 当参数之一是指针数组时,如何从C#调用C DLL
- 调用C++dll的C#dll在windows 10上找不到该dll