2

Delphi 7 で DLL を理解するのに苦労しています。2 つの問題があります。

1) プロシージャは整数パラメータを取りますが、dll は私が渡した値とは異なる値を受け取ります。

2) dll を呼び出したアプリケーションは、関数の完了後にアクセス違反でクラッシュします。

これが私のdllコードです:

library apmDLL;

uses
  Classes, Messages, Windows, Dialogs, sysutils ;

const

  WM_MY_MESSAGE = WM_USER + 1;

procedure sendtoACRPM (functionKey : integer); stdcall;
  begin
    showmessage('You sent -  '+inttostr(functionKey));
    showmessage('Finished Now');
  end;

exports sendtoACRPM;

end.

したがって、以下のコードでこれを呼び出すと、次のようになります。

「送信中 - 1」

「送信しました - 1636532」

「ただいま終了」

次に、呼び出し元のアプリケーションがアクセス違反でクラッシュします。

呼び出し元のアプリケーションは次のようになります。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, shlobj, shellapi;

const

  WM_MY_MESSAGE = WM_USER + 1;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);



  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  procedure sendtoACRPM (functionKey : integer) ; external 'apmDLL.dll';

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
  myInt: integer;
begin
  myInt := strtoint(edit1.text);
  showmessage('Sending - ' + inttostr(myInt));
  sendtoACRPM(myInt);
end;

end.

ここで私が間違っていることはありますか?

4

1 に答える 1

4

stdcallDLL と呼び出しコードの宣言の両方に必要です。あなたはそれをDLLに持っているだけです。

呼び出し規約は両側で一致する必要があります。:-)

procedure sendtoACRPM (functionKey : integer); stdcall; external 'apmDLL.dll';

Delphi 以外のアプリケーションからも DLL を使用できるように、 のMessageBox代わりに標準の Windows を使用する必要があります。ShowMessage

于 2013-04-24T22:45:35.713 に答える