ExitProcessの関数コールについて教えてください

このQ&Aのポイント
  • ExitProcessの関数コールについて教えてください。WinMainを抜けた後に指定の関数をコールする際にエラーが発生し、dll関連の問題の可能性があります。
  • 現在DirectX9.0とWindows7 64bitでプログラムを書いている状況で、test.exeのハンドルされていない例外が発生し、0xC0000005のエラーコードが表示されます。
  • 解決方法はdll関連の問題を確認することです。具体的な解決策は見つかっていませんが、dllが正しく読み込まれているか確認し、dll関連の設定を適切に行うことをおすすめします。
回答を見る
  • ベストアンサー

ExitProcessの関数コールについて教えてください。

ExitProcessの関数コールについて教えてください。 現在DirectX9.0とWindows7 64bitでプログラムを書いているのですが、WinMainを抜けた後 C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\crt\src\crt0dat.c の void __cdecl __crtExitProcess (     int status     ) {     __crtCorExitProcess(status);     /*     * Either mscoree.dll isn't loaded,     * or CorExitProcess isn't exported from mscoree.dll,     * or CorExitProcess returned (should never happen).     * Just call ExitProcess.     */     ExitProcess(status); } という関数のExitProcessという関数をコールするところで test.exe の 0x6a6b4319 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00c86060 を読み込み中にアクセス違反が発生しました。 というエラーが出てしまいます。 少し調べたところdllが云々のような記述を見つけたのですが解決方法を見つけることができませんでした。 解決方法をご教授ください。 /** Windows7 Ultimate 64bit Core i7 920 2.67GHz メモリ:12GB HDD:1TB Geforce9800GTX+ VisualStudio2008 AcademicEdition */

  • 0xEF
  • お礼率59% (193/327)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

プログラムはマルチスレッド ( _beginthread、_beginthreadex、CreateThread などで、スレッドを作成 ) でしょうか? もしマルチスレッドであるなら、子スレッドに問題 ( スタック領域のメモリ破壊等 ) があるのではないかという気がします。

その他の回答 (1)

  • chie65535
  • ベストアンサー率43% (8525/19381)
回答No.1

スタートアップルーチンがWinMainを呼び出す前に確保して使用し、WinMainを抜けた後にExitProcessなどが参照するメモリを破壊している可能性が高いです。 例えば「WinMainが呼ばれた時点で、ポインタなど、何らかの意味ある値が入っているグローバル変数や、グローバルな構造体変数」などが破壊されている可能性が非常に高いです。 それらは「変数」ですから、当然、動いているプロセスそのものは値を自由に変えられます。つまり「ポインタとしてアクセスした時に、メモリアクセス違反が起きるような値に書き替える事だって出来る」のです。 配列の添え字が負数になっているとか、ポインタが不正になっているか、など、メモリを破壊している部分が無いか、確かめてみましょう。

関連するQ&A

  • コールバック関数

    VB6.0でコールバック関数みたいなのを呼び出して 別のプロシージャを作成する事ってできないでしょうか? 並列処理をさせたいのですが、あるdllを呼び出しくる際 戻り値が返ってくるのを待ってしまいその部分でラグが発生してしまいます。 そのdllに関してのみ別のプロシージャに投げて戻り値が返ってくるのを待たず、 戻り値をパブリック変数に順次格納していきたいのですがVB6.0 or .netで可能でしょうか? VB6.0SP3 Windows2k

  • コールバック関数

    お世話になります。VB.NETにてソフト制作をしています。 今回、DLLの関数を利用する事になりましたが、うまく宣言できず困っています。御教授お願いします。 DLLはC++で作られており変更できません。 DLLは通信を補助するための物で、初期設定の関数と通信開始の物があります。 初期設定用を呼んだ後、通信開始を行なうようです。 説明には下記のような内容がありました。 【初期設定用】  initial(DWORD ip, LPNOTIFICATIONFUNC notificationFunc); ip=相手先のipアドレス  notificationFunc=コールバック関数へのポインタ コールバック関数    WINAPI *PNOTIFICATIONFUNC( DWORD id, BYTE bySet1, BYTE bySet2, BYTE bySet3, BYTE *data, DWORD datasize ); 【通信開始用】  start(DWORD ip BYTE *code ); ip=通信元のipアドレス code=相手のコードの格納アドレス 以上 全体的にどう宣言したら良いのか解りません。 (特にコールバック関数の宣言と、ポインタへの引数の渡し方) すみませんが、御教授お願いします。

  • VB.NET デリゲートへのコールバック関数の設定

    VB.NET デリゲートへのコールバック関数の設定 VB.NETとネイティブC/C++ DLL間でのコールバックについての質問です。 ネイティブDLLからVOID*で得られるコールバック関数をVB.NETのデリゲートに 登録するには、どのようにコーディングすればよいのでしょうか。 ---------- VB.NETソース ---------- Public Delegate Sub CALLBACK_00(ByVal Arg1 As Integer, ByVal Arg2 As Integer) Declare Function FuncPtrGet Lib "test.dll" () As CALLBACK_00 Dim Func As new CALLBACK_00(FuncPtrGet()); 2行目は、実際にはVOID*が帰るDLL関数です。 3行目がコンパイルで通りません。AddressOfで関数を指定するようにメッセージが出ます。

  • コールバック関数 再び

    またまた、お世話になります。前回、御回答頂き動作するようにはなったのですが、コールバックに入力があった時に、アプリケーションが終了してしまう現象がおきています。御教授お願いします。 C++で作られたDLLを利用。 装置との通信を行なう物で初期設定用と通信開始用の 関数があり、コールバック関数で、装置からの送信もある。このDLLを使った、他のアプリで動作確認は取れているのでDLL自体には問題ないと思われる。 関数説明 【初期設定用】  initial(DWORD ip,LPNOTIFICATIONFUNC notificationFunc); ip=相手先のipアドレス notificationFunc=コールバック関数へのポインタ コールバック関数 WINAPI *PNOTIFICATIONFUNC(  DWORD id,  BYTE bySet1,  BYTE bySet2,  BYTE *data,  DWORD datasize); 以上の説明があり、現在下記のように宣言して使っています。 【初期設定用】 Declare Function MT_INITIALIZE Lib "TEST.dll" Alias "Initial" _  (ByVal ip As Integer, ByVal notificationFunc As CallBack) As Boolean Public Delegate Sub CallBack( _  ByVal id As Integer, _ ByVal byset1 As Byte, _ ByVal byset2 As Byte, _ ByVal data As IntPtr, _ ByVal dataSize As Integer) 【コールバック関数】 Public Shared Sub notificationFunc( _  ByVal id As Integer, _ ByVal byset1 As Byte, _ ByVal byset2 As Byte, _ ByVal data As IntPtr, _ ByVal dataSize As Integer )   //データのバッファ処理 End Sub

  • 16ビットDLLから32ビットDLLをコールする方法

    現在VC++で「16ビットDLLから32ビットDLLをコール」をしようと思って 調べていましたが、このご質問に頼るしか方法がなく、困っています。 状況  VB4.0(16bit)・・・16bit版でEXEを作成  VC++1.51・・・・・16bitDLLを作成  VC++4.0/6.0・・・・32bitDLLを作成  VB4.0(16bit)のEXEから、16bit版のDLLをコールし処理を行いたいの  ですが、16bit版DLLで扱えないVC++の関数(プロセス関数:spawn??())  を利用しなければならず、16bit版DLLの機能を32bit版DLLで作成し、  16bit版DLLから32bit版DLLを呼び出そうと思っております。 誰か助けて! 是非、皆様のお知恵を拝借致したく思います。

  • ERFC関数と逆関数

    初歩的な質問だと思いますが、 C/C0 =ERFC(x/2*SQRT(D*t))をxについて解くと、 x =2*SQRT(D*t)*ERFC-1(C/C0)という表記で大丈夫ですか? ERFC-1はERFC関数の逆関数という意味です。また、ERFC-1をエクセルで表す場合、どのような関数(もしくは手法)を用いればよいのですか? ERFC関数・逆関数・エクセルと検索してもよくわかりませんでした。 よろしくお願い致します。

  • 逆関数

    C/C0 =ERFC(x/2*SQRT(D*t))をxについて解くと、 x =2*SQRT(D*t)*ERFC-1(C/C0)という表記で大丈夫ですか? ERFC-1はERFC関数の逆関数という意味です。また、ERFC-1をエクセルで表す場合、どのような関数(もしくは手法)を用いればよいのですか? ERFC関数・逆関数・エクセルと検索してもよくわかりませんでした。 よろしくお願い致します。

  • c++からdll内の関数を呼ぶ記述方法が知りたいです。

    VC++2008 Expressを使っています。 c++からdll内の関数を呼ぶ記述方法が知りたいです。 hoge.dllの関数 int test(int x); c++ ??????????

  • 伝達関数を求めることができるでしょうか。

     定数項Cのある下式で、x(t)とy(t)との伝達関数L[X(s)]/L[Y(s)]を求めることができますか。  dx(t)/dt + x(t) + C = y(t)  これを2回微分して定数項を消去して求めても良いのでしょうか。初期値はすべてゼロです。 x(t), y(t) は時間tの関数です。数学は得意でないので、表記など誤りがありましたらご指摘く ださい。

  • 偏導関数

    二回連続微分可能な任意の関数f(x)に対して、関数 u=u(t,x)を u(t,x)=f(x+ct)+f(x-ct) c:正の定数 と定義すると、uは次の式(弦の振動方程式)を満たすことを示せ utt(二回微分)=c^2uxx uttはu=u(t,x)の高階偏導関数 の解き方がわかりません。