2010-08-09 133 views
1

我进入电影交流写的DLL函数,原型为:调用DLL函数

#include "extcode.h" 
#pragma pack(push) 
#pragma pack(1) 

#ifdef __cplusplus 
extern "C" { 
#endif 

void __stdcall PSA_Send_BO(char hostname[], char BO_NumberIn[], 
    char BO_NumberOut[], int16_t *Status, char Error_text[], int32_t *Error_code, 
    int32_t *length_BO_NumberOut, int32_t *length_error_text); 

long __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module); 

#ifdef __cplusplus 
} // extern "C" 
#endif 

#pragma pack(pop) 

我的Delphi代码:

procedure Aaa(HostNaam: PChar; BO_To: PChar; BO_From: PChar; ErrorText: PChar; 
       var OutputLength: LongInt; var ErrorLength: LongInt; 
       var ErrorNumber: Longint 
      ) ; far; stdcall; external 'aaa.dll' 


{$R *.dfm} 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    BO_From, ErrorText: Array[0..999] of Char; 
    ErrorLength, BoLength, ErrorNumber: LongInt; 
begin 
    Aaa(PChar(edtHostName.Text), PChar(edtBoNumber.Text), BO_From, ErrorText, BoLength, ErrorLength, ErrorNumber); 

    Label1.Caption := 'BO_From = ' + BO_From ; 
    Label2.Caption := 'BoLength = ' + IntToStr(BoLength); 
    Label3.Caption := 'ErrorText = ' + ErrorText; 
    Label4.Caption := 'ErrorLength = ' + IntToStr(ErrorLength); 
    Label5.Caption := 'ErrorNumber = ' + IntToStr(ErrorNumber); 
end; 

当我运行这个例子中,返回的字符串BO_FromErrorText是空的,所有其他返回的参数都可以。

当我注释其中一行显示返回的参数时,字符串显示的很好! 使用调试器进入代码具有类似的效果。 在显示它们之前复制所有返回的参数不起作用。 返回的字符串的长度远低于声明的大小。

有人有任何线索吗?

在此先感谢您的帮助,

回答

0

没有看到该dll的细节,这是很难说究竟是怎么回事。有一件事,虽然...

你需要设置ErrorLength和BOLength?通常在这样的调用中,这些调用中的缓冲区大小被填充。这使得DLL可以避免任何缓冲区溢出。所以请尝试,在拨打电话之前将它们设置为999。

+0

感谢您的回复。 已经尝试过你的建议,问题依然存在... – user415496 2010-08-09 20:52:37

+0

哎呀,你不错! 我现在已经解决了问题,是的,我必须提前设置E​​rrorLength和BoLength。 谢谢唐老师的建议! – user415496 2010-08-16 07:33:38

1

您在procedure Aaa的声明中找不到var Status: Smallint

1

正如Sertac Akyuz所述,您有一个缺少的状态参数,并且由于stdcall参数从右向左(http://docwiki.embarcadero.com/RADStudio/en/Procedures_and_Functions#Calling_Conventions)传递,所以在此缺少的参数之前声明的任何参数都将被损坏。

如果您希望代码在Delphi 2009+上运行,您还应该在Delphi 2009+上自SizeOf(Char)= 2转换PChar => PAnsiChar和Char => AnsiChar。

“far”指令也过时了。

procedure Aaa(HostNaam: PAnsiChar; BO_To: PAnsiChar; BO_From: PAnsiChar; 
       var Status: SmallInt; ErrorText: PAnsiChar; 
       var OutputLength: LongInt; var ErrorLength: LongInt; 
       var ErrorNumber: Longint 
      ) ; stdcall; external 'aaa.dll';