2

私は次のコードでDelphiXE2でコード化されたdllを持っています:

procedure xMain(MSG:String);export;
begin
  MessageBox(0,PWideChar(MSG),'Title',0);
end;

exports xMain;

今、私はこの関数を次のようなFASMアプリケーションにインポートしています。

library  dllfile, "testdll.dll"

import   dllfile,\
         xMain,   "xMain"

そして利用はそうです:

section ".data" data readable writeable

szMSG     db "Message from FASM application!",0

section ".code" code readable executable

invoke    xMain,szMSG

ただし、結果のメッセージボックスは、次のように歪んだ文字で表示されます。

ここに画像の説明を入力してください

これは、関数呼び出しの正確な結果です。

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

6

出力は、UTF-16 でエンコードされたテキストを想定している関数に ANSI テキストを送信したときに発生するものです。このことから、FASM コードが ANSI ペイロードを DLL に送信していると結論付けました。また、DLL は Unicode 対応の Delphi でコンパイルされており、そのためのstring手段UnicodeStringChar手段WideCharなどがあります。

双方を一致させる必要があります。たとえば、Delphi コードを次のように変更します。

procedure xMain(Msg: PAnsiChar); stdcall;
begin
  MessageBoxA(0, Msg, 'Title', 0);
end;

その他の注意点:

  1. export関数宣言の最後には必要ありません。最新の Delphi コンパイラでは無視されます。
  2. モジュールの境界を越えて Delphi のマネージド文字列を使用しないでください。いずれにせよ、FASM 側では、パラメーターを ANSI エンコード文字配列へのヌル終了ポインターとして宣言しました。そして、それはPAnsiCharです。
  3. コードでは、Delphiregister呼び出し規約を使用しています。FASM がそれを使用しているとは信じがたいです。私は期待しstdcall、セルタックの答えはそれを裏付けています
于 2012-10-23T13:41:18.650 に答える
6

2 つの作業サンプルを次に示します (Windows 用の FASM 1.70.03 を使用)。

Ansi バージョン、
dll:

library testdll;

uses
  windows;

procedure xMain(MSG: PAnsiChar); export; stdcall;
begin
  MessageBoxA(0, PAnsiChar(MSG), 'Title', 0);
end;

exports xMain;

begin
end.

EXE:

format PE CONSOLE 4.0
entry start

include 'win32a.inc'

section '.code' code readable executable
  start:
    invoke xMain, szMSG
    invoke ExitProcess, 0

section '.data' data readable writeable
    szMSG db 'Message from FASM application!', 0

section '.idata' import data readable writeable
  library kernel32, 'kernel32.dll',\
          dllfile, 'testdll.dll'

  include 'api\kernel32.inc'

  import dllfile,\
         xMain, 'xMain'


Unicode バージョン、
dll:

library testdll;

uses
  windows;

procedure xMain(MSG: PChar); export; stdcall;
begin
  MessageBox(0, PChar(MSG), 'Title', 0);
end;

exports xMain;

begin
end.

EXE:

format PE CONSOLE 4.0
entry start

include 'win32w.inc'

section '.code' code readable executable
  start:
    invoke xMain, szMSG
    invoke ExitProcess, 0

section '.data' data readable writeable
    szMSG du 'Message from FASM application!', 0

section '.idata' import data readable writeable
  library kernel32, 'kernel32.dll',\
          dllfile, 'testdll.dll'

  include 'api\kernel32.inc'

  import dllfile,\
         xMain, 'xMain'
于 2012-10-29T20:54:41.753 に答える
1

MSG 引数はStringではなく である必要がありPCharますか?

于 2012-10-22T18:00:53.317 に答える