掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる (ID:49508)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
DLL は別プロセスで実行されます.アプリで言えば全く別のアプリです. 別プロセス (別のアプリ) の例外等のエラーは,そのアプリ内で処理するのが原則です. Windows API の関数の多くは,実際の処理結果は引数で,エラー等は戻り値で取得するようになっています. > S := E.Message; // S は string 型の変数 > StrPCopy(P,E.Message); // P は Char型の文字配列 StrPCopy(P,E.Message); で文字列が取得できるのは,DLL 内の関数の文字列の引数の扱いと同じですね. DLL が発行するメッセージですから基本的に Null 終端文字列です. また,メモリを仲介しないと正常に取得できません.例外が発生します. つまり, > Memo1.Lines.Add(S); //エラーになる ではなく,S := E.Message; で例外が発生していることになります. メモリを介するという意味では StrPCopy が良いと思います. 参考までに以下のようにも書けます (メモリを使用しているのを明確するための参考). バグかという問題は,質問された方におまかせします. //============================================================================= // DLL内の関数実行による例外を補足する例 // 別プロセスの例外,エラーはそのプロセスで処理するのが基本 // このコードでの例外はDLLで発生している // したがってメッセージの文字列はNull終端文字列(基本的にPChar型) // 別プロセスのメッセージなのでメモリを介さないと取得できない // // 短いコードでも手抜きはしない方針 // 以下は実際にコピペで動作確認可能なコード // // 動作確認は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro //============================================================================= procedure TForm1.Button1Click(Sender: TObject); var DLLExecute : function : Integer; stdcall; ModuleHandle : HModule; TPExecute : TFarProc; LStream : TMemoryStream; LCharArry : array[0..256] of Char; begin Memo1.Lines.Clear; ModuleHandle := LoadLibrary('DUMMY.DLL'); if ModuleHandle <> 0 then begin TPExecute := GetProcAddress(ModuleHandle, 'Execute'); if (TPExecute <> nil) then begin @DLLExecute := TPExecute; try DLLExecute; except on E: Exception do begin LStream := TMemoryStream.Create; try LStream.Write(PChar(E.Message)^, (Length(E.Message) + 1) * SizeOf(Char)); LStream.Position := 0; LStream.Read(LCharArry, LStream.Size); finally FreeAndNil(LStream); end; end; end; end; Memo1.Lines.Add(LCharArry); FreeLibrary(ModuleHandle); Memo1.Lines.Add(LCharArry); end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.