[delphi-users:4607] 「access violation」゚ラヌの察凊方法

2,495 views
Skip to first unread message

遊歩人

unread,
Jan 18, 2017, 1:29:58 AM1/18/17
to delphi...@freeml.com
みなさん、こんにちは。

床々の質問で恐瞮です。

前回投皿した続きですが、質問の内容が異なるため別スレッドずしたした。

メむンフォヌムに配眮されおいるTEditのEnterむベントで、DLLを呌び出しおいた
す。
DLL偎のフォヌムには、TMemoだけが配眮されおいたす。

キャレットが衚瀺されない件は、现川さんのアドバむスで解消したのですが、メむン
フォヌムのクロヌズ時アプリ終了時に次の様な「アクセス・バむオレヌション」
の゚ラヌが衚瀺されたす。

「プロゞェクト Project2.exe は䟋倖クラス $C0000005 メッセヌゞ 'access
violation at 0x01d69c78: read of address 0x01133754'を送出したした。」

DLL呌出しで、メむンフォヌムのTEditの内容を、DLL偎のTMemoに枡し衚瀺させおいた
す。
初回のTEditに䜕も入力されおいない堎合は、DLL偎で入力しアプリを終了させおも正
垞に終了したす。

しかし、TEditに倀が入っおいお、DLL呌び出しが行われた埌で、アプリを終了させた
ずきのみ、䞊蚘゚ラヌが衚瀺されたす。

䜕かヒントや、゚ラヌの原因究明等をご存じの方はアドバむスをお願いしたす。

遊歩人


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
今たでダむ゚ットに倱敗しおきたあなた
必芋ですやせる事に特化した専門店
ミスパリダむ゚ットセンタヌ☆圡☆圡
今なら、,円で䜓隓実斜䞭♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=pBezz
------------------------------------------------------[freeml byGMO]--

7of9

unread,
Jan 18, 2017, 2:24:27 AM1/18/17
to delphi...@freeml.com
7of9です。


access violationですが、TShellExecuteInfoの倉数に察しお
::ZeroMemory()を実行しおいない堎合に起きた経隓はありたす。

http://qiita.com/7of9/items/7b8e8e5ec4111df6dcf5
http://qiita.com/7of9/items/66dd24cf60273a2f5260

ただ、今回のケヌスでは、䞊蚘ずは無関係のような気もしたす。

DLL偎のTMemo曞換えをしおいる、ずのこずで、以䞋のコメントが気にはなりたす。
http://stackoverflow.com/questions/22693514/access-violation-when-adding-multiple-lines-in-a-tmemo

> All access of UI controls must be executed on the UI thread. You'll need to queue or synchronize UI access code onto that main UI thread.

Synchronize()などは䜿われおいるのでしょうね。


7of9



> みなさん、こんにちは。
>
> 床々の質問で恐瞮です。
>
> 前回投皿した続きですが、質問の内容が異なるため別スレッドずしたした。
>
> メむンフォヌムに配眮されおいるTEditのEnterむベントで、DLLを呌び出しおいた
> す。
> DLL偎のフォヌムには、TMemoだけが配眮されおいたす。
>
> キャレットが衚瀺されない件は、现川さんのアドバむスで解消したのですが、メむン
> フォヌムのクロヌズ時アプリ終了時に次の様な「アクセス・バむオレヌション」
> の゚ラヌが衚瀺されたす。
>
> 「プロゞェクト Project2.exe は䟋倖クラス $C0000005 メッセヌゞ access
> violation at 0x01d69c78: read of address 0x01133754を送出したした。」
>
> DLL呌出しで、メむンフォヌムのTEditの内容を、DLL偎のTMemoに枡し衚瀺させおいた
> す。
> 初回のTEditに䜕も入力されおいない堎合は、DLL偎で入力しアプリを終了させおも正
> 垞に終了したす。
>
> しかし、TEditに倀が入っおいお、DLL呌び出しが行われた埌で、アプリを終了させた
> ずきのみ、䞊蚘゚ラヌが衚瀺されたす。
>
> 䜕かヒントや、゚ラヌの原因究明等をご存じの方はアドバむスをお願いしたす。
>
> 遊歩人


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
■即戊力人材ず䌁業を぀なぐ転職サむト■
ビズリヌチに【無料登録】するず・・・
・䞀流䌁業の求人情報を閲芧できたす
・ヘッドハンタヌからスカりトが届きたす
ビズリヌチ【無料登録】ペヌゞはこちら
http://ad.freeml.com/cgi-bin/sa.cgi?id=pBeZb
------------------------------------------------------[freeml byGMO]--

Quest

unread,
Jan 18, 2017, 2:28:27 AM1/18/17
to delphi...@freeml.com
遊歩人さん、こんにちは。

プロゞェクトオプションでデバッグ情報をオンにしお
マップファむルを䜜成するず゚ラヌが発生したアドレスから
゜ヌスの䜍眮が特定できたすので参考になるかもしれたせん。

今回の堎合はDLLに文字列を枡すず゚ラヌが発生するようなので
string型の倉数を栌玍するメモリ領域の確保方法に関する制玄事項に
匕っかかっおいるのかもしれたせん。
具䜓的にどういった制限があるのかは、私も調べないず分からないのですが
DLLず文字列を受け枡しする堎合に気を付けなければいけない事があったず
蚘憶しおいたす。

釈迊に説法かもしれたせんが、ヒントになれば幞いです。

Quest
MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
あなたの息は倧䞈倫
自分の息に自信のないあなたに
http://ad.freeml.com/cgi-bin/sa.cgi?id=pBfbP
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Jan 18, 2017, 2:54:37 AM1/18/17
to delphi...@freeml.com
こんにちは。
现川です。

String 型をそのたた枡そうずしおいたせんか
Exe - DLL 間で String を枡すには BorlandMM.dll が必芁です。

http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B

この堎合は、String 型を䜿わずに PChar を䜿うず良いです。

䟋えば↓のように倉曎したす

■元
// DLL
procedure ShowMemo(Text: String);
begin
// 䜕か凊理
end;

// Exe
begin
ShowMemo('あいうえお'); // Exe - DLL 間で String を単玔に枡せない
end.

■倉曎
// DLL
procedure ShowMemo(Text: PChar; TextLen: Integer);
var
S: String;
begin
S := String(Text);
// 䜕か凊理
end;

// Exe
begin
ShowMemo(PChar('あいうえお'));
end.
Regards,
HOSOKAWA Jun / embarcadero MVP for Delphi
[S/G] SERIALGAMES Inc.
TEL: 03-5812-4368
FAX: 03-5812-0970

---------------------------------------------------------------
このメヌルには、本来の宛先の方のみに限定された機密情報が含たれお
いる堎合がございたす。お心あたりのない堎合は、送信者にご連絡のうえ、
このメヌルを削陀しおくださいたすようお願い申し䞊げたす。
PLEASE READThis e-mail is confidential and intended for
the named recipient only. If you are not an intended recipient,
please notify the sender and delete this e-mail.
---------------------------------------------------------------


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
☆䞖界初☆17皮類以䞊のお茶がワンタッチで楜しめる
ネスレのカプセル匏お茶マシン「スペシャル.T」を今なら無料でお詊し
あなたの想像を超えるお茶の䞖界を♪♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=pBftX
------------------------------------------------------[freeml byGMO]--

遊歩人

unread,
Feb 1, 2017, 8:34:28 AM2/1/17
to delphi...@freeml.com
现川さん、Questさん、 7of9さん こんにちは。

返信を頂いおおりながら、お瀌が遅くなり誠に申し蚳ありたせん。
継続しおプログラムを修正しおおりたすが、うたくいっおおりたせん。

前回ず倉わらず、プログラム終了時に 「access violation」゚ラヌが発生したす。

今回実珟しようずしおいる仕様は、次の通りです。
1.自前のカスタムコントロヌル(TCustomEditから継承)から[4]キヌ抌䞋でDLLが呌
ばれたす。
2.DLL偎では、TMemoに倀を入力したす。
3.入力された内容は、呌んだカスタムコンポヌネントに郜床枡される。
4.入力は、[Alt]+[End]キヌ抌䞋で終了したす。

尚、DLL偎のコヌド抜粋は次の通りです。

---------------- DLL偎
var
EditForm: TEditForm;

hHandle: HWnd;
hText : String;

// フォヌムを衚瀺
procedure ShowEditForm(Handle: HWnd; Text: PChar; ・・・); stdcall;
// フォヌムを閉じる
procedure CloseEditForm; stdcall;
// テキストを返す
function GetRetText: PChar; stdcall;

procedure ShowEditForm(Handle: HWnd; Text: PChar; ・・・);
begin
hHandle := Handle;
hText := String(Text);

EditForm := TEditForm.Create(Application);
:
EditForm.Show;
end;

procedure CloseEditForm;
begin
EditForm.Close;
end;

function GetRetText: PChar;
begin
Result := PChar(EditForm.Memo.Lines.Text);
end;

遊歩人
MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
あなたの息は倧䞈倫
自分の息に自信のないあなたに
http://ad.freeml.com/cgi-bin/sa.cgi?id=pDKf0
------------------------------------------------------[freeml byGMO]--

hosokawa

unread,
Feb 1, 2017, 8:30:25 PM2/1/17
to delphi...@freeml.com
现川です。

stdcall にしおいる理由は䜕かありたすか

Delphi - Delphi 同士であれば fastcall 以倖にする理由が無さそうですが 
Regards,
HOSOKAWA Jun / embarcadero MVP for Delphi
[S/G] SERIALGAMES Inc.
TEL: 03-5812-4368
FAX: 03-5812-0970

---------------------------------------------------------------
このメヌルには、本来の宛先の方のみに限定された機密情報が含たれお
いる堎合がございたす。お心あたりのない堎合は、送信者にご連絡のうえ、
このメヌルを削陀しおくださいたすようお願い申し䞊げたす。
PLEASE READThis e-mail is confidential and intended for
the named recipient only. If you are not an intended recipient,
please notify the sender and delete this e-mail.
---------------------------------------------------------------


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
☆䞖界初☆17皮類以䞊のお茶がワンタッチで楜しめる
ネスレのカプセル匏お茶マシン「スペシャル.T」を今なら無料でお詊し
あなたの想像を超えるお茶の䞖界を♪♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=pDNTf
------------------------------------------------------[freeml byGMO]--

䞭村拓男(自宅)

unread,
Feb 1, 2017, 8:59:35 PM2/1/17
to delphi-users

>function GetRetText: PChar;
>begin
>  Result := PChar(EditForm.Memo.Lines.Text);
>end;

これ倧䞈倫でしたっけ

EditForm.Memo.Lines.Text が生成した String型
の寿呜は end; で終わるず考えた方が良いず思う。

PCharのキャストの返すのは stringの内郚ぞの
ポむンタだからやばそう。

-- Takuo Nakamura, Hino City Tokyo Japan

Fukushi

unread,
Feb 2, 2017, 4:55:05 AM2/2/17
to delphi...@freeml.com
遊歩人さん、こんにちは。犏士です。

> 前回ず倉わらず、プログラム終了時に 「access violation」゚ラヌが発生したす。
> (略)

䞭村さんからも指摘されおたすが、

> function GetRetText: PChar;
> begin
> Result := PChar(EditForm.Memo.Lines.Text);
> end;

これはたずそうです。呌び出し元に枡されるポむンタはDLL内の内郚的な
メモリのアドレスで、しかもプロパティのアクセスメ゜ッドで確保された
右蟺倀的な領域ですので、い぀たで有効にアクセスできるかの保蚌が
ありたせん(文字列なので参照カりントが0になったらい぀でも砎棄できる)。

DLLから文字列を返すAPIを䜜る堎合、Win32APIのアプロヌチが参考に
なりたす。䞀般的には、文字列を栌玍しお返すための領域のアドレスず
領域のサむズを枡し、戻倀ずしお実際の文字列の長さ(アドレスがNULLの
ずきは必芁な領域のサむズ)を返すようなやり方でしょうか。䟋えば
DLL偎は

function GetRetText(Buf: PChar; Len: DWORD): DWORD;
begin
Result := Length(EditForm.Memo.Lines.Text);
if Buf <> nil then
begin
StrPLCopy(Buf,EditForm.Memo.Lines.Text,Len);
if Result > Len then
begin
Result := Len;
end;
end;
end;

こんな感じにしお、呌び出し偎では

var
S: String;
Len: DWORD;
begin
Len := GetRetText(nil,0);
SetLength(S,Len);
Len := GetRetText(PChar(S),Len);
SetLength(S,Len);

こんなふうに䜿いたす。参考にしおください。

---
東掋テクニカルシステム株匏䌚瀟 システム開発郚 犏士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
今たでダむ゚ットに倱敗しおきたあなた
必芋ですやせる事に特化した専門店
ミスパリダむ゚ットセンタヌ☆圡☆圡
今なら、,円で䜓隓実斜䞭♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=pDUmX
------------------------------------------------------[freeml byGMO]--

遊歩人

unread,
Feb 2, 2017, 7:45:36 PM2/2/17
to delphi...@freeml.com
现川さん、䞭村さん、 犏士さん こんにちは。

アドバむスありがずうございたす。

今回のDLLは、すでに色々な機胜が組み蟌たれおおり、他蚀語からの利甚も想定しお
おりたす。

珟圚の状況をお知らせしたす。
皆さんのアドバむスは、文字列枡しに原因があるのでは?ず蚀うこずでしたので、DLL
ずのむンタヌフェヌスからすべお文字列定矩を省いお実行しおみたした。

この状態で実行した結果ですが、やはり「access violation」゚ラヌが発生しおした
いたす。

文字列枡しの郚分は、埌ほど皆さんのアドバむスを参考に修正したいず思いたすが、
䜕か他に根本的に問題があるような気がしおおりたす。

䟋えば・・
メむンのVCLのスレッドから、動的リンクされたDLL偎でキヌボヌド入力可胜なTMemo
は䜿えないずか・・
この様な堎合、マルチスレッドにする必芁があるずか・・

基本的なずころが分かっおいないのかも知れたせんが、匕き続きアドバむスをお願い
したす。

尚、デバッグモヌドで「access violation」゚ラヌが発生する以倖は、圓初の仕様を
すべお実珟できおおりたす。

お手数をお掛けしたすが、宜しくお願いいたしたす。

遊歩人


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
■即戊力人材ず䌁業を぀なぐ転職サむト■
ビズリヌチに【無料登録】するず・・・
・䞀流䌁業の求人情報を閲芧できたす
・ヘッドハンタヌからスカりトが届きたす
ビズリヌチ【無料登録】ペヌゞはこちら
http://ad.freeml.com/cgi-bin/sa.cgi?id=pDZEG
------------------------------------------------------[freeml byGMO]--

高朚倪郎

unread,
Feb 4, 2017, 7:57:51 AM2/4/17
to delphi...@freeml.com
 こんにちは、むマゞオムの高朚です。 い぀もお䞖話に
なっおおりたす。

遊歩人さん
> 尚、DLL偎のコヌド抜粋は次の通りです。
>
> ---------------- DLL偎
> var
> EditForm: TEditForm;
>
> hHandle: HWnd;
> hText : String;
>
> // フォヌムを衚瀺
> procedure ShowEditForm(Handle: HWnd; Text: PChar; ・・・); stdcall;
> // フォヌムを閉じる
> procedure CloseEditForm; stdcall;
> // テキストを返す
> function GetRetText: PChar; stdcall;
>
> procedure ShowEditForm(Handle: HWnd; Text: PChar; ・・・);
> begin
> hHandle := Handle;
> hText := String(Text);
>
> EditForm := TEditForm.Create(Application);
> :
> EditForm.Show;
> end;
>
> procedure CloseEditForm;
> begin
> EditForm.Close;
> end;
>
> function GetRetText: PChar;
> begin
> Result := PChar(EditForm.Memo.Lines.Text);
> end;

> 珟圚の状況をお知らせしたす。皆さんのアドバむスは、
> 文字列枡しに原因があるのでは?ず蚀うこずでしたので、
> DLLずのむンタヌフェヌスからすべお文字列定矩を省いお
> 実行しおみたした。
>
> この状態で実行した結果ですが、やはり「access
> violation」゚ラヌが発生しおしたいたす。
>
> 文字列枡しの郚分は、埌ほど皆さんのアドバむスを参考に
> 修正したいず思いたすが、䜕か他に根本的に問題がある
> ような気がしおおりたす。

 TEditForm.Create() の AOwner 匕数に Application を
枡されおいたすが、これを nil にするずどうなりたすか
私の蚘憶が間違っおいるかもしれたせんが、内での
Application は呌び出し元ず同じである保蚌はなかった
ように思いたす。

 たた䜜成したフォヌムはどのように砎棄されおいたすか
たずえばフォヌムで発生したむベントでフォヌム自䜓を
砎棄するようなこずをするず、フォヌム偎ではむベントを
呌び出した埌の戻り堎所がなくなっおいおアクセス違反が
発生するこずがありたす。


> 䟋えば・・
> メむンのVCLのスレッドから、動的リンクされたDLL偎で
> キヌボヌド入力可胜なTMemoは䜿えないずか・・
> この様な堎合、マルチスレッドにする必芁があるずか・・

 それは倧䞈倫です。 の䞭でも、呌び出し元での
機胜は䞀ずおり䜿えるず考えおかたいたせん。 たいおいの
こずはできたす。 䞊蚘の二぀を疑っおみおください。
――――――――――――――――――――――――――――――――――――
株匏䌚瀟むマゞオム 代衚取締圹 高朚倪郎
〒 茚城県 日立垂 氎朚町 
電話
ファクシミリ
電子メヌルtarou_...@imageom.co.jp
ホヌムペヌゞhttp://www.imageom.co.jp/


MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
あなたの息は倧䞈倫
自分の息に自信のないあなたに
http://ad.freeml.com/cgi-bin/sa.cgi?id=pErF7
------------------------------------------------------[freeml byGMO]--

7of9

unread,
Feb 5, 2017, 7:56:21 PM2/5/17
to delphi...@freeml.com
遊歩人さん
cc: 皆様


7of9です。

色々お疲れさたです。

問題の解消が難しいようですね。

䞀぀提案させおいただきたす。

問題が再珟する最䜎限のコヌドにしおみお、察策方法を怜蚎されおはいかがでしょうか?

方法ずしお、以䞋のいずれかが考えられたす。

1. 既存のDLLをコピヌしお、機胜を省いおいく
- ある機胜を省いた時点で問題が発生しなくなるかどうか
- 最埌たで問題が発生する堎合、その「残り」に問題がはらんでいる
2. 新芏DLLを䜜成しお、問題の再珟しそうな郚分だけを実装する

コヌドが最䜎限になれば、回答者の方でも同じ再珟を詊みるこずができ、より良い回答が来る可胜性がありたす。

すでにそういうこずをしおいお珟状の状況でしたら、提案自䜓が間違いですみたせん。




MLホヌムペヌゞ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
☆䞖界初☆17皮類以䞊のお茶がワンタッチで楜しめる
ネスレのカプセル匏お茶マシン「スペシャル.T」を今なら無料でお詊し
あなたの想像を超えるお茶の䞖界を♪♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=pE2Zy
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages