Delphi与C dll通信(参数)
嗨,我在Delphi 2007应用程序中集成DLL时遇到了一些问题.
我怀疑我对调用的参数做错了. 1) 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返回故障. 它正在检查的事情: 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 所以在这个阶段,我知道我已经成功地与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) 从远处开始,没有相同的硬件和软件,不可能做出更好的诊断. 你可以阅读我的article on conversion.这也有一些段落解释了如何调试代码以找出正确的调用约定.它也可以帮助您解决转换标题的更多问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |