喫茶XRAYトップページ

[▲前のスレッド]

[12302] 別プロセスのメッセージを捕捉返信 削除
2018/9/20 (木) 16:28:00 Mr.XRAY
[DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201809/18090005.txt

でレスしたコードの実行結果です.


[12303] Re:別プロセスのメッセージを捕捉返信 削除
2018/9/20 (木) 17:20:10 Mr.XRAY
> [DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる]
> http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201809/18090005.txt


早くも反応が

>質問の意図が理解出来ていないようで・・・・
>FreeLibraryで変数Sが破壊される理由はなにか?


メモリアクセス違反の例外ですからね.
メモリアクセス違反の例外を発生するコードを実行して,どうしてそうなるのか ? と訊かれても,
「私困っちゃう...」

以下のスレッドも似たようなもんですね.
メモリアクセス違反の例外が発生する可能性があるコード
(この場合は配列の範囲外の操作) を実行しているわけですから,
string 型の変数の定義で例外発生,Integer 型だと例外が発生しないのは何故か ?
と訊かれても困ってしまいますです.ハイ.

[UNITを追加したら、読み取り違反のエラーが出るようになったのですが??]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201808/18080007.txt

# レスするんじゃなかった (ホソッ).またまた自己嫌悪.


[12306] メモリアクセス違反の例外返信 削除
2018/9/20 (木) 17:49:49 Mr.XRAY
メモリアクセス違反の例外が発生した場合,
その例外が発生する原因を調べて対処することは必要ですが,

メモリアクセス違反の例外が発生する状態のままで実行された結果を,
どうしてそういう結果になるかを調べることはあまり意味がないと思っています.
ただし,これはあくまでも個人的な意見,見解です.


[12307] Re:別プロセスのメッセージを捕捉返信 削除
2018/9/20 (木) 23:08:12 Mr.XRAY
[DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201809/18090005.txt

>AAA 2018/09/20(木) 21:58:42 書込者ID:[ 26FSmWST1pEdhB1L06XZlQ ]
>そんなに質問の内容を理解できていなかった事を指摘されて
>悔しいですか?


はい,悔しいです.なわけないでしょうが.


[12308] メモリの不正アクセスの結果返信 削除
2018/9/20 (木) 23:23:44 Mr.XRAY
▼ Mr.XRAYさん
> [DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる]
> http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201809/18090005.txt
>
> >AAA 2018/09/20(木) 21:58:42 書込者ID:[ 26FSmWST1pEdhB1L06XZlQ ]
> >そんなに質問の内容を理解できていなかった事を指摘されて
> >悔しいですか?
>
> はい,悔しいです.なわけないでしょうが.


喫茶XRAY のお客様には既知のことと思いますが.
アクセスの内容にもよるかも知れませんが,
一般的には,メモリの不正アクセスの結果を予測することはできません.
これは,配列の範囲外操作でも同じです.

もちろん
「メモリアクセス違反の例外が発生するかも知れない」
という予測はなしです (笑)


[12309] Re:メモリの不正アクセスの結果返信 削除
2018/9/21 (金) 11:29:01 Mr.XRAY
> 一般的には,メモリの不正アクセスの結果を予測することはできません.
> これは,配列の範囲外操作でも同じです.


メモリアクセス違反の例外 (デバッガ例外通知) が発生したら,
例外が発生する状態のままで取得した結果の原因を調べることに意味は
ほとんど (あるいは全く) ないということです.
それよりも例外が発生しないようにすることが最優先ということです.

Mr.XRAY 2018/09/20(木) 21:41:01
Mr.XRAY 2018/09/20(木) 21:48:43

のレスは,嫌味というかちょっとばかり意地悪のつもりで書き込んでしまいました.
スレッド汚しですね.私の悪い性格です m(_ _)m


[12310] Re2:メモリの不正アクセスの結果返信 削除
2018/9/21 (金) 13:42:03 taka
▼ Mr.XRAYさん
> > 一般的には,メモリの不正アクセスの結果を予測することはできません.
> > これは,配列の範囲外操作でも同じです.
>
> メモリアクセス違反の例外 (デバッガ例外通知) が発生したら,
> 例外が発生する状態のままで取得した結果の原因を調べることに意味は
> ほとんど (あるいは全く) ないということです.
> それよりも例外が発生しないようにすることが最優先ということです.
>
> Mr.XRAY 2018/09/20(木) 21:41:01
> Mr.XRAY 2018/09/20(木) 21:48:43
>
> のレスは,嫌味というかちょっとばかり意地悪のつもりで書き込んでしまいました.
> スレッド汚しですね.私の悪い性格です m(_ _)m


まとめ
・ShareMemは使わない
・DLLの戻り値型関数で戻り値を返さず例外は投げる
・例外は、呼び出し側のtry exceptでキャッチする
・ポインタを使うと違反は発生しない

最初の投稿で
ポインタを使うと違反は発生しない
ことを示しておいて

共有メモリや
標準的なDLLの仕様を教えると 聞く耳持たず

ASさんと同じで
「Delphiのバグ」という回答が欲しかったのでしょう。



[12311] Re3:メモリの不正アクセスの結果返信 削除
2018/9/21 (金) 14:07:21 Mr.XRAY
> ASさんと同じで
> 「Delphiのバグ」という回答が欲しかったのでしょう。


そうか,そういうことなんですね.
気づかないで悪いことしてしまいました.ゴメンナさい (笑)


[12312] Re4:メモリの不正アクセスの結果返信 削除
2018/9/21 (金) 14:57:00 taka
▼ Mr.XRAYさん
> > ASさんと同じで
> > 「Delphiのバグ」という回答が欲しかったのでしょう。
>
> そうか,そういうことなんですね.
> 気づかないで悪いことしてしまいました.ゴメンナさい (笑)



Win32版 エラーになる「無効なポインタ操作.」。
  PChar(E.Message)にすると エラーにはならない。

Unicode版 エラーにはならない。

EXE(unicode),DLL(win32) アドレス00000000 なんとか違反で 例外処理すら許されない。
EXE(win32), DLL(unicode) アドレス00000000 なんとか違反。


まとめ(非推奨): DLLの関数から例外を投げる (sharememは使わない場合)
・どうしても投げたいなら、exe,dll 同じバージョンでコンパイルする
 except on E: Exception do
   begin
     S := E.Message;  // この段階では同じアドレスを指している。どちらかの内容が変更されない限り同じアドレスを指す
     UniqueString(S); // 新しいアドレスに文字列を複製する
   end;
 end;

 S := string(PChar(E.Message));
 S := StrUtils.LeftStr(E.Message, Length(E.Message));
 S := Copy(E.Message, 1, Length(E.Message));
を使っても文字列を複製しなおすことができる

ついでなので Lazarusでやってみると、
Stack overflow が発生し 2回以上実行すると暴走。

普通の人は、
DLLで発生した例外は、きちんとDLL内で処理しよう。外におもらししないこと


[12317] Re5:メモリの不正アクセスの結果返信 削除
2018/9/21 (金) 18:14:25 Mr.XRAY
▼ takaさん

>   PChar(E.Message)にすると エラーにはならない。

そうなんですよ.AAA さんが提示したコードで気づきました.

S := E.Message + 'XXXX';

string 型の文字列を + しているので E.Message は暗黙の型キャストですね.多分.
なら PChar で OK でしょう ? というわけです.

今回の場合はこれで OK なんですが,
実はこの他に何かの操作をすると問題が発生する,
というのが以前どこかのコミュニティの場であったんです.
内容は失念しました.Ansi 版と Unicode 版の違いだったのかも.

>・どうしても投げたいなら、exe,dll 同じバージョンでコンパイルする

基本的にはすべきではないてすね.
DLL は別プロセスでの実行なので (笑) <--- ここだけの秘密です !!


[12313] DLLは別プロセス?返信 削除
2018/9/21 (金) 17:21:06 Mr.XRAY
> [DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる]
> http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201809/18090005.txt


ありゃ,au さんが

>au 2018/09/21(金) 14:27:11
>質問の本題とは関係ないですが1点
>DLLとEXEは別のプロセスではなく
>DLLはEXEのプロセスにロードされて同じメモリ空間で実行されるはずです。


そりゃそうだ.ハハハッ (笑ってごまかす !!)
au さんサンクスです.
私のレスの

>DLL は別プロセスで実行されます.アプリで言えば全く別のアプリです.

意味不明な感じになっていますね.ホホホッ
サイトの記事にも同じような文章があるかも知れない...(涙)


でもって,au さんの書き込みの後の書き込みが...
大爆笑 !!!
無茶苦茶でござりますがな.


[12314] Re:DLLは別プロセス?返信 削除
2018/9/21 (金) 17:39:54 おかぽん
▼ Mr.XRAYさん

> AAA 2018/09/21(金) 16:01:03 書込者ID:[ Hyj8kQaJhYqJEk42Q3slGw ]
> 当然全部知ってるし メモリマネージャーが EXE と DLL が異なることも知ってる


知ってるなら、

> Mr.XRAY 2018/09/20(木) 16:16:55 書込者ID:[ JVAeg37QOegf62xLIjQZ8g ]
> DLL は別プロセスで実行されます.アプリで言えば全く別のアプリです.


このへんに、つっこみ入れてほしいものですね。


通りすがりさんに、(そのつもりはなくても)煽られて、必死になってるだけにしか
見えなくて、痛々しい・・・。
最近話題になった、高齢のあの方同様、自分の欲しい答えが無ければだめな人なのか。


なお、気になって読んでましたが、正直「別プロセス?あれ?そうだっけ?」って、
なってしまったのは、ここだけの秘密です。


[12316] Re2:DLLは別プロセス?返信 削除
2018/9/21 (金) 17:58:10 Mr.XRAY
▼ おかぽんさん

> なお、気になって読んでましたが、正直「別プロセス?あれ?そうだっけ?」って、
> なってしまったのは、ここだけの秘密です。


お願いします.本当にここだけの秘密にしておいてください m(_ _)m
私の名誉を守るために <-- お前に名誉なんかあるのか ?

で,AAA さんは結局何が知りたかったんでしょうね ?
tor さんの説明がだいぶ気に入ったようですが.


[12321] Re:別プロセスのメッセージを捕捉返信 削除
2018/9/22 (土) 07:35:43 SO
▼ Mr.XRAYさん
> [DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる]
> http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201809/18090005.txt


そもそも、お作法的にバグのような。。。

あと、StrPCopyでエラーにならないって、まぁいいですけど(たまたまだし)、
StrPCopy自体がNULL終端を期待しての動作なので、
void *memcpy(void *buf1, const void *buf2, size_t n);
みたいに、サイズ指定があるものを使用したほうがいいですよね。

通りすがりさんが書いている、「要はWin32APIのような作りにする、ということです。」で分かって欲しいような。

[12323] DLLにおけるエラーおもらし禁止条項返信 削除
2018/9/22 (土) 10:40:45 taka
▼ SOさん
> ▼ Mr.XRAYさん
> > [DLL上の例外をコピーした文字列をFreeLibraryにアクセスとエラーになる]
> > http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201809/18090005.txt
>
> そもそも、お作法的にバグのような。。。


Delphi付属のマニュアル本に掲載されていたような記憶があったので
ヘルプを探してみました

開発者ガイド: Delphi プログラマーズガイド

パッケージと DLL の作成
> DLL とライブラリは,Windows ダイアログでエラーや警告が表示されるのを防ぐために,
> すべての例外を処理する必要があります。


http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devwin32/idh_creatingpackagesanddlls_xml.html


C++
Docs > Visual C++ > ドキュメント > 並列プログラミング
ランタイムによってスローされた例外
> ランタイムの呼び出しから例外が発生する可能性があります。
> ...
> プログラミング エラーを診断する必要がある場合にのみ、
> 回復不能なエラーをアプリケーション コードでキャッチまたは処理することをお勧めします。
> ...
> アプリケーションの異常終了を防ぐために、コードでランタイムを呼び出す場合は例外が処理されるようにしてください。



[12325] Re2:別プロセスのメッセージを捕捉返信 削除
2018/9/22 (土) 16:52:31 Mr.XRAY
> そもそも、お作法的にバグのような。。。

御意 !!

> あと、StrPCopyでエラーにならないって、まぁいいですけど(たまたまだし)、

御意 !!
以下「御意 !!」になってしまう可能性があるので省略 (笑)
taka さんがヘルプを調べてくださっていますね.
お疲れ様です.
AAA さんも,こういうことを確認,調べる機会を与えてくれた,
ということで感謝しましょう !?

# SO さんと tata さんの書き込みがもったいないから,某掲示板にレスしようかな ?


[12334] Re3:別プロセスのメッセージを捕捉返信 削除
2018/9/22 (土) 17:52:06 SO
▼ Mr.XRAYさん

御意 !!w

え〜、少し質問ですけど、
DelphiでDLLとの文字列のやり取りって、
Stringクラス(型?)を使うのがスタンダードなんですか?

--
C,C++でWin APIだと、戻り値でエラーの場合、
GetLastErrorを使っていました(^^;A

https://msdn.microsoft.com/ja-jp/library/cc428944.aspx



[12337] Re4:別プロセスのメッセージを捕捉返信 削除
2018/9/22 (土) 18:02:27 Mr.XRAY
▼ SOさん

> DelphiでDLLとの文字列のやり取りって、
> Stringクラス(型?)を使うのがスタンダードなんですか?


えっ !? そうなんですか ?
Null 終端文字列じゃなかったかしら ?
私また変なこと書きました ? DLL が別プロセスで実行とか (笑)

> C,C++でWin APIだと、戻り値でエラーの場合、
> GetLastErrorを使っていました(^^;A


えっ !?
GetLastError でいいと思うのですが...
何か問題でも.


[12339] Re5:別プロセスのメッセージを捕捉返信 削除
2018/9/22 (土) 18:15:11 Mr.XRAY
> Null 終端文字列じゃなかったかしら ?
>私また変なこと書きました ? DLL が別プロセスで実行とか (笑)


サイトの記事には Null 終端文字列を使うべきと書いています ! (キッパリ)


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