2018/6/14 (木) 07:41:42 Mr.XRAY |
[DLL にて except 使用]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201806/18060002.txt
abc 2018/06/14(木) 05:58:32
のコードを解読すると以下のようなことのようです.
何とも言えない,面白いのか,変なのか,摩訶不思議なと言うか... (^^:
DLL を使用する側のプロジェクトのコード
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
procedure FormProcA(AText: PChar);stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure DLL_funcA(AProc: TFarProc); stdcall; external 'Test_DLL.dll';
//-----------------------------------------------------------------------------
// DLL内の関数を実行
// 引数はこのユニット内で定義している関数
// つまり,DLLからこのフォームの関数を実行している
//-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
DLL_funcA(@FormProcA);
end;
//-----------------------------------------------------------------------------
// この関数をDLLから実行する
//-----------------------------------------------------------------------------
procedure FormProcA(AText: PChar);
begin
Form1.Memo1.Lines.Add(AText);
end;
end.
DLL のコード
library Test_DLL;
uses
Windows;
type
TMyFuncType = procedure (AText: PChar);stdcall;
var
FormProcA : TMyFuncType;
//-----------------------------------------------------------------------------
procedure DLL_funcA(AProc: TFarProc); stdcall;
begin
@FormProcA := AProc;
FormProcA('*** ABC ***');
end;
//-----------------------------------------------------------------------------
exports
DLL_funcA;
end.
実行結果です.
実行環境は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro です.
質問された方が書いている LogWriteProc2 は無理です.
何故なら関数内関数になっています.
もちろん,expect は全く関係ありませんです.
もちろん,バグでもありません.
これが朝起きて最初の作業.おそまつ ! (笑)
|
|