2010-08-09 112 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';