喫茶XRAYトップページ

[スレッド全体
]

[12328] Re3:DLL内の関数で発生した例外の捕捉返信 削除
2018/9/22 (土) 17:25:11 taka
▼ Mr.XRAYさん
> ▼ takaさん
>
> > http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E6%96%87%E5%AD%97%E5%88%97%E5%9E%8B%EF%BC%88Delphi%EF%BC%89
>
> 恥ずかしながらこのページをまともに読んだことがありませんでした.
> 貴重なことが書いてありますね.


いまUnicodeでテストすると

UniqueString(LErrStr);
でアクセス違反になってしまいました。
うーん。。。

string型にはつかえないみたい

Win32
 procedure UniqueString(var str: string); overload;
 procedure UniqueString(var str: WideString); overload;

Unicode
 procedure UniqueString(var str: UnicodeString); overload;
 procedure UniqueString(var str: _WideStr);
 procedure UniqueString(var str: _AnsiStr);

対象の型が違うみたいですね

StrUtils.LeftStr(E.Message, Length(E.Message));
のほうがいいのかな・・・


[12332] Re4:DLL内の関数で発生した例外の捕捉返信 削除
2018/9/22 (土) 17:41:29 Mr.XRAY
▼ takaさん

> UniqueString(LErrStr);
> でアクセス違反になってしまいました。


このアクセス違反のダイアログの表示は 1 回だけのようです.
EXE を直接起動すると表示されませんでした.

デバッガで追跡したわけではないのですか,
IDE から実行すると DLL がメモリにロードされます
すると,デバッガの機能が働いて,DLL 側の (メモリ上の) エラーを検出するのでは
と思ってします.この DLL 側のアクセス違反は try - except で捕捉できないのではと.


[12333] Re5:DLL内の関数で発生した例外の捕捉返信 削除
2018/9/22 (土) 17:48:38 taka
▼ Mr.XRAYさん
> ▼ takaさん
>
> > UniqueString(LErrStr);
> > でアクセス違反になってしまいました。
>
> このアクセス違反のダイアログの表示は 1 回だけのようです.
> EXE を直接起動すると表示されませんでした.
>
> デバッガで追跡したわけではないのですか,
> IDE から実行すると DLL がメモリにロードされます
> すると,デバッガの機能が働いて,DLL 側の (メモリ上の) エラーを検出するのでは
> と思ってします.この DLL 側のアクセス違反は try - except で捕捉できないのではと.


dll2個と関数2個の4回チェックしていたので
コードを1回チェックに修正したらでなくなりました。
落ちていた原因がUniqueStringではなかったみたいです。
違うところで落ちてたみたいです。


     if (PChar(LErrStr) = PChar(E.Message)) then
         Memo1.Lines.Add(Format('%d %d', [Integer(PChar(LErrStr)),Integer(PChar(E.Message))]));
     UniqueString(LErrStr);

    Memo1.Lines.Add(Format('%d %s', [Integer(PChar(LErrStr)), LErrStr]));

を別々のところに差し込むとアドレスが変更されたのがわかります。


[12335] Re6:DLL内の関数で発生した例外の捕捉返信 削除
2018/9/22 (土) 17:56:23 Mr.XRAY
▼ takaさん

> コードを1回チェックに修正したらでなくなりました。
> 落ちていた原因がUniqueStringではなかったみたいです。
> 違うところで落ちてたみたいです。


ゴメンナさい.私のミスです.こちらでも例外発生しなくなりました.
プロジェクトのビルド (再構築) を忘れていました (汗)

>
>      if (PChar(LErrStr) = PChar(E.Message)) then
>          Memo1.Lines.Add(Format('%d %d', [Integer(PChar(LErrStr)),Integer(PChar(E.Message))]));
>      UniqueString(LErrStr);
>
>     Memo1.Lines.Add(Format('%d %s', [Integer(PChar(LErrStr)), LErrStr]));
>
> を別々のところに差し込むとアドレスが変更されたのがわかります。


なるほど,こういうコードにすればいいですね.


[12340] Re7:DLL内の関数で発生した例外の捕捉返信 削除
2018/9/22 (土) 18:21:43 taka
▼ Mr.XRAYさん
> ▼ takaさん
>
> > コードを1回チェックに修正したらでなくなりました。
> > 落ちていた原因がUniqueStringではなかったみたいです。
> > 違うところで落ちてたみたいです。
>


エラーになった原因は、 win32版のDLLを unicodeのexeに読み込んだため
例外時の内部的な文字列処理関係で アクセス違反になったようです。

いまのところ
 E.Messageをローカル変数代入で
  0による除算 では 読み込み違反は発生しない。
  StrToInt('NG')では、読み込み違反が発生する。
という現象があるのがわかっているので
システム関係のエラーはグローバル的な文字列定数から引っ張ってきているのかな?
と思って調べていますが わかりません。



[12336] Re6:DLL内の関数で発生した例外の捕捉返信 削除
2018/9/22 (土) 17:59:19 SO
▼ takaさん

UniqueStringって、某掲示板での「Copy on write」を強制させるやつなんですね。


[12338] Re7:DLL内の関数で発生した例外の捕捉返信 削除
2018/9/22 (土) 18:12:13 taka
▼ SOさん
> ▼ takaさん
>
> UniqueStringって、某掲示板での「Copy on write」を強制させるやつなんですね。


私も さっきまで この関数の存在をしりませんでした。(笑

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82