Delphi与C dll通信(参数)

Delphi与C dll通信(参数),第1张

概述嗨,我在Delphi 2007应用程序中集成DLL时遇到了一些问题. 我怀疑我对调用的参数做错了. 此刻我有2个问题,但我认为它们与彼此有关. 1) 首先使用DLL调用: 来自.h文件: extern "C" {__declspec(dllexport) HRESULT Startup(char* version);} 这个调用应该初始化DLL并给我DLL的版本. HRESULT应为0,版 嗨,我在Delphi 2007应用程序中集成DLL时遇到了一些问题.

我怀疑我对调用的参数做错了.
此刻我有2个问题,但我认为它们与彼此有关.

1)
首先使用DLL调用:
来自.h文件:

extern "C" {__declspec(dllexport) HRESulT Startup(char* version);}

这个调用应该初始化DLL并给我DLL的版本. HRESulT应为0,版本指针应包含版本.

我的Delphi代码:

function Startup(var version: Pchar): HRESulT; cdecl; stdcall; external 'myDLL.dll';

和实际的电话:

var  res : HRESulT;  name1 : PChar;  test : AnsiString;  buf2: array [0..20] of AnsiChar;begin  FillChar(buf2,20,0);  name1:= @buf2[0];  res := RdmStartup(name1);//Here res = 0,but the name1 stays empty,and the buf2 still contains 0.end;

但结果是0,呼叫成功.

然后我的第二个问题:我需要调用DLL中的一个函数来打开一个COM端口.

.h:

extern "C" {__declspec(dllexport) HRESulT Open(HWND hWnd,int Port,DWORD Baudrate,DWORD Interval); }

我的德尔福宣布:

function Open(hWnd: HWND;Port : integer;Baudrate:LongInt;Interval:LongInt): HRESulT; cdecl; stdcall; external 'myDLL.dll';

我称之为:

res:= Open(self.Handle,5,115200,500);

在这里,我从res变量中的DLL返回故障.
我也有DLL的来源,我得到的失败来自DLL正在检查参数是否有效的部分,如果它们有效则会继续,否则返回我当前得到的错误.

它正在检查的事情:

if(hWnd == NulL){    return false;}if(Baudrate != 2400 && Baudrate != 9600 && Baudrate != 38400 && Baudrate != 115200){    return false;} if(IntervalTimer < 300){    return false;}std::string strPortname = lexical_cast<std::string>( format("COM%d") % Port);std::string strPortname(lpPortname.c_str());std::string::size_type Loci = strPortname.find("COM");if( Loci == std::string::npos ){    return false;}return true;

以上其中一个在我的调用中返回false,因为如果此函数的结果为false,则DLL会给出我当前在结果中得到的错误.
有谁知道我做错了什么?

我已经尝试了很多类型的组合到最后我坚持转换我发现在:http://www.drbob42.com/delphi/headconv.htm
我也尝试了不同的方法来读取char指针,但所有这些都失败了……

所以在这个阶段,我知道我已经成功地与DLL通信,因为我正在为2个调用获得不同的HRESulT,但我怀疑我的参数不像应该的那样工作.

我正在使用Delphi 2007,而C DLL是使用VS2010构建的.

解决方法 启动声明非常可疑:

__declspec(dllexport) HRESulT Startup(char* version);

这转化为:

function Startup(version: PAnsiChar): HResult; stdcall; external 'myDLL.dll';

所以那里应该没有var.

我从你的评论中得到了cdecl调用约定适用于你的一些代码.在这种情况下删除stdcall,因为它取代了前面的cdecl.

open()的声明似乎很好(我会使用DWORD作为类型,而不是Longint,特别是因为这些天DWORD是Longword – 但是在Win32中它们的大小相同,所以这对于您).你似乎也传递了正确的参数.

你没有写出你得到的HRESulT值.但我认为端口COM5根本无法使用这些设置打开.

你能做什么?

您应该从Startup()中删除var.

所以你可以尝试:

>使用cdecl而不是stdcall(声明中的stdcall否决了cdecl)
>打开具有不同参数的不同COM端口
>解码返回的HRESulT.

从远处开始,没有相同的硬件和软件,不可能做出更好的诊断.

你可以阅读我的article on conversion.这也有一些段落解释了如何调试代码以找出正确的调用约定.它也可以帮助您解决转换标题的更多问题.

总结

以上是内存溢出为你收集整理的Delphi与C dll通信(参数)全部内容,希望文章能够帮你解决Delphi与C dll通信(参数)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1272005.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存