Вызов функции dll - PullRequest
       3

Вызов функции dll

1 голос
/ 10 августа 2010

Мне нужно получить доступ к написанной функции c 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_From и ErrorText пусты, все остальные возвращаемые параметры в порядке.

Когда я комментирую одну из строк, где я делаю отображение возвращаемых параметров, строки отображаются хорошо! Вступление в код с помощью отладчика имеет аналогичный эффект. Копирование всех возвращенных параметров перед их отображением не имеет никакого эффекта. Длина возвращаемых строк намного меньше заявленного размера.

У кого-нибудь есть подсказка?

Заранее спасибо за любую помощь,

Cock

Ответы [ 3 ]

1 голос
/ 15 августа 2010

В объявлении procedure Aaa отсутствует var Status: Smallint.

1 голос
/ 15 августа 2010

Как упоминал Сертак Акьюз, у вас отсутствует параметр Status, и поскольку параметры stdcall передаются справа налево (http://docwiki.embarcadero.com/RADStudio/en/Procedures_and_Functions#Calling_Conventions),, любые параметры, объявленные до этого отсутствующего параметра, будут повреждены.

Если вы хотите, чтобы код функционировал в Delphi 2009+, вам также следует преобразовать PChar => PAnsiChar и Char => AnsiChar, поскольку SizeOf (Char) = 2 в Delphi 2009 +.

Директива "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';
0 голосов
/ 10 августа 2010

Не видя подробностей о dll, трудно сказать точно, что происходит.Хотя, одна вещь ...

Вам нужно установить ErrorLength и BOLength?Обычно при таких вызовах они заполняются размером буфера при вызове.Это позволяет DLL избежать любого переполнения буфера.Поэтому попробуйте установить их на 999, прежде чем совершать вызов.

...