名前 題名 ▼ Mr.XRAYさん > > 質問された方が書いている LogWriteProc2 は無理です. > > 何故なら関数内関数になっています. > > もちろん,expect は全く関係ありませんです. > > これなんですが,DLL を使用する側を以下とします. > > procedure TForm1.Button2Click(Sender: TObject); > > //この関数はinterface部で定義(関数宣言を)していない > //関数内関数はinterface部で定義(関数宣言)できない > procedure LogWriteProc2(AText: PWideChar); stdcall > begin > Memo1.Lines.Add(AText); > Memo1.Lines.Add('LogWriteProc2'); > end; > > begin > DLL_funcB(@LogWriteProc2); > end; > > そして DLL 側の DLL_funcB を以下のようにします. > もちろん DLL_funcB は exports 部に追加して,var にも次のように追加しておきます. > > var > FormProcA : TMyFuncType; > LogWriteProc2 : TMyFuncType; > > procedure DLL_funcB(AProc: TFarProc); stdcall; > begin > @LogWriteProc2 := AProc; > LogWriteProc2('*** DDD ***'); > end; > > 実行するとできてしまうんですね (下図が実行結果).知りませんでした. > で DLL_funcB を以下にすると例外が発生します.当然と言えば当然なのですが. > これが質問された方が言う「バグ」ですね. > 自分が意図しない動作をするのは全て「バク」? 好きです,こういう姿勢 (笑) > > procedure DLL_funcB(AProc: TFarProc); stdcall; > begin > try > @LogWriteProc2 := AProc; > LogWriteProc2('*** DDD ***'); > except > end; > end; > GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link