2

我在处理 Delphi 7 中的 DLL 时遇到了麻烦。我有两个问题:

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

您需要stdcall在 DLL 和调用代码声明中。您只在 DLL 中拥有它。

调用约定需要双方匹配。:-)

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

您应该使用标准的 WindowsMessageBox而不是ShowMessage,这样 DLL 也可以在非 Delphi 应用程序中使用。

于 2013-04-24T22:45:35.713 回答