ページ 1 / 1
NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 08:08
by シエル
お世話になります。
デバッグをしていて、「*******で初回の例外が発生しました: *******: NULL 参照ポインターがスタブに渡されました。」
というエラーが右下のログを表示する部分に表示されていることが分かりました。
アスタリスクの部分にはメモリアドレスのようなものが書いてあります。
このようなログは表示されているのですが、ゲームの処理には支障はなく、普通にプレイできます。
ですが、エラーは全て消しておきたいので、このエラーを解消したいと思っています。
手がかりがメモリアドレスだけで、ゲームに支障がないので、どこが原因なのか分からず困っています。
このようなエラーの場合、どこが原因なのかを突き止めるにはどうデバッグすればよろしいでしょうか?
皆さんのお力をお貸し下さい。
よろしくお願い致します!
追記:
コンパイラはvisual c++ 2008EEで、OSはwindows7です。

Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 08:15
by めるぽん
そのエラーは RPC 経由のエラー(RPC_X_NULL_REF_POINTER)ですね。
COM を使ってる部分(多分 DirectX ですかね?)で NULL になってはいけない引数が NULL になってしまっているようです。
DX ライブラリ経由で DirectX を呼び出しているのであれば、DX ライブラリに不要な NULL を渡していないかチェックして、DirectX を直接呼び出しているのであれば、DirectX に不要な NULL を渡していないかチェックしましょう。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 08:32
by シエル
ぬるぽんさん!ありがとうございます。
DirectXで開発しています。
NULLを渡すとまずい部分にNULLを渡すと出てしまうエラーですか。勉強になります!
実はウィンドウをアクティブにするたびに出るんですよね。。。
描画部分かキー入力周りを片っ端から調べてみます!
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 11:00
by シエル
う~ん。探してみたんですが見つからない;
メモリアドレスからどうにかして原因箇所を割り出す方法はないですかね?
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 11:20
by めるぽん
そういえば例外投げた瞬間に捕捉する機能が VS にあったようなって調べてみたら、ありました。
http://msdn.microsoft.com/ja-jp/library/d14azbfh.aspx
1. [デバッグ] メニューの [例外] をクリックします。
2. [例外] ダイアログ ボックスで、例外の全体カテゴリの [スローされるとき] を選択します (たとえば、[Common Language Runtime Exceptions] など)。
だそうです。これで COM のエラーを捕捉できるかどうかは分かりませんけど、とりあえず全部にチェックを入れてやってみるといいかもしれません。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 11:47
by シエル
ぬるぽんさん!ありがとうございました!
例外を補足できて、原因箇所が分かりました!
DirectXのエラーではなくて、WindowsAPIのDispatchMessageのところにカーソルが行ったので
DispatchMessageのエラーだと思われます。
が、なぜDispatchMessageでエラーが出るのか分かりません。
該当のコードは以下のようになっております。
色々PeekMessageの引数をPM_NOREMOVEに変えてみたり、GetMessageにしてみたりしたんですが、
エラーが消えません。。。
下記のコードで何かおかしい部分はありますでしょうか?
必要であれば他のコードも載せます。
while(1){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message==WM_QUIT)
break;
DispatchMessage(&msg);
}else{
//ここにゲーム処理
}
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 12:08
by めるぽん
そうなるとちょっと今の段階では分からないですね。
現象の再現するコードと、再現手順があるといいかもしれません。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 12:39
by へろりくしょん
ディスパッチされたプロシージャの中でエラーが起きてるとかそういうのは無いですか。
ウィンドウをアクティブにするたびに出るということですから、WM_ACTIVATE あたりとか。
エラーが起きる時の msg の中身を記録したりして、プロシージャの中身まで掘り下げていった方がいいかもしれませんね。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 12:39
by シエル
すいません。全部のコードを載せるわけにはいかないので、
今再現するコードを作成中です。
が、再現しない;
やっぱりゲームメインの処理も関係してるのかなぁ。。。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 12:43
by シエル
>>へろりさん
ありがとうございます。
ウィンドウプロシージャで制御してるメッセージは下記のコードだけなんですよね。。。
WM_AVTIVATEは処理してません。
で、色々試しているうちに、PeekMessageの第二引数をNULLからhwndに変えたら、
DispatchMessageではエラーは出なくなったのですが、画面を終了する際に、
ウィンドウプロシージャのWM_CLOSEのif文のところで同じエラーが出るようになってしまったんですよね。
何か思い当たるところがございましたら、ご指導よろしくお願い致します。
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,TEXT("終了しますか?"),TEXT("終了確認"),MB_YESNO | MB_ICONQUESTION)){
DestroyWindow(hwnd);
}
return 0;
}
return DefWindowProc(hwnd,msg,wp,lp);
}
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 12:46
by シエル
エラーが出る際の、MSG構造体のmessageメンバの値は「275」でした。
現在調査中です。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 13:09
by シエル
すいません。再現するコードを作っていると、
どうやらDirectsoundの初期化処理をスキップするとエラーが出なくなったので、
もう一度Directsoundの処理を見直してみます。
なので一旦忘れてください。
一応エラーが解消されたら、解決にします。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 14:57
by シエル
すいません。やっぱりわかりません。。。
再現するコードが作成できたので貼ります。
ダイレクトサウンドを初期化して、解放するだけのコードです。
よろしくお願いいたします。
#include <windows.h>
#include <dsound.h>
#pragma comment(lib,"dsound.lib")
HWND hwnd;
HINSTANCE hinst;
LPDIRECTSOUND8 lpds8;
BOOL InitWindowClass(WNDPROC wndproc,LPCTSTR lpszclassname);
HRESULT DsoundInit(void)
{
if(DS_OK!=DirectSoundCreate8(NULL,&lpds8,NULL))
return E_FAIL;
if(DS_OK!=lpds8->SetCooperativeLevel(hwnd,DSSCL_PRIORITY)){
return E_FAIL;
}
return S_OK;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,TEXT("終了しますか"),TEXT("test"),MB_YESNO))
DestroyWindow(hwnd);
return 0;
}
return DefWindowProc(hwnd,msg,wp,lp);
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
MSG msg;
int width=700,height=640;
hinst = hInstance;
//親ウィンドウクラス名
LPCTSTR classname = TEXT("test");
RECT rect;
rect.left=0;
rect.right=width;
rect.top=0;
rect.bottom=height;
AdjustWindowRect(&rect,WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE | WS_MINIMIZEBOX,FALSE);
if(!InitWindowClass(WinProc,classname)) return -1;
hwnd = CreateWindow(
classname,TEXT("テストウィンドウ"),WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_VISIBLE | WS_MINIMIZEBOX,
(GetSystemMetrics(SM_CXSCREEN)-width)/2,(GetSystemMetrics(SM_CYSCREEN)-height)/2,
rect.right-rect.left,rect.bottom-rect.top,
NULL,NULL,hinst,NULL);
if(hwnd==NULL) return -1;
DsoundInit();
while(1){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message==WM_QUIT){
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
Sleep(16);
//
}
}
lpds8->Release();
return msg.wParam;
}
BOOL InitWindowClass(WNDPROC wndproc,LPCTSTR lpszclassname)
{
WNDCLASSEX winc;
winc.cbSize=sizeof(WNDCLASSEX);
winc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
winc.lpfnWndProc = wndproc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hinst;
winc.hIcon = NULL;
winc.hCursor = LoadCursor(NULL,IDC_ARROW);
winc.hbrBackground =NULL;
winc.lpszMenuName = NULL;
winc.lpszClassName = lpszclassname;
winc.hIconSm=NULL;
return RegisterClassEx(&winc);
}
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 15:48
by toyo
私の環境では再現しませんね
例外は出ませんでした
VC++2008 VC++2010EE vista 32bitです
ひょっとして7は64ビットOSでしょうか(EEだと64ビット版はコンパイルできませんよね)
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 15:49
by へろりくしょん
Windows7 Visual Studio .NET 2003 再現しません。
DirectXはさっぱり分かりませんが、DirectX9 SDK 入ってます。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 15:53
by めるぽん
自分の環境でも出なかったです。
WindowsXP
Visual Studio 2008 Standard Edition
DirectX SDK (February 2010)
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:15
by シエル
皆さんの環境では再現しませんか;
私の環境がまずいのかなぁ。困りましたね。
原因がまったく分からないです。
ちなみに、
OSはWindows7 Home Premiumの32ビットOSです。
SDKはNovember 2008です。
一応デバッグ時の画面を貼っておきます。
何か分かる方、ご教授よろしくお願い致します。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:23
by 御津凪
プロジェクトのプロパティは(インクルードパスとかビルドに必須な個所を除いて)何もいじってないのですよね?
デフォルトから何かいじっているのならそれを書いた方がいいかもしれません。
ですがその前に、 SDK を最新のものにしてみてください。(現段階では June 2010 が最新)
SDK ごとに使用されるランタイムも違うので、もしかしたらそれで解消されるかもしれませんよ。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:26
by シエル
御津凪さん。ありがとうございます!
プロパティは何もいじっていません。
一応念のため聞きますが、SDKを最新にしても、
今まで通りのコードでプログラムは組めますでしょうか?
一応これ以外にもD3DやDirectinputなどのコードもたくさん書いているので、
更新したら、いきなりコンパイルできなくなった~なんてことないですよね?
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:28
by シエル
あ、ちなみにランタイムだけは一週間前ぐらいには更新しました。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:43
by 御津凪
推薦されなくなった機能(DirectMusicや、DirectX9の一部の関数など)が新しい SDK でなくなっていることはありますが、
必要だと思っていた機能が使えなくなるようなことは一部を除いてほとんどありません。
(一部というのは MIDI が再生できていた DirectMusic のこととか)
最新の SDK をインストールしても、前の SDK をアンインストールしなければ、
インクルードパス・ライブラリパスを切り替えるだけで問題ないので、何かしらコンパイルできないなどの問題が
あってもすぐに使用する SDK を戻すことができます。
なお、使用している SDK に対応したランタイムを使用するので、ランタイムの更新だけではランタイムにバグがあった場合を除き改善することはありません。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:50
by シエル
SDKを最新にしてみることにします。
ところで、SDKは、JUNE 2010が最新なのでしょうか。
下記ページでは、February 2010が最新と出ているのですが、
ページが間違っているのでしょうか?
http://msdn.microsoft.com/ja-jp/directx/aa937788.aspx
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:51
by toyo
複数のDXSDKをインストールするのは問題ないです
設定で優先順位が変えられるので一番上に持っていくだけでいいですよ
私はこれだけ入れてます
関係ないですがVC++2010だとこの設定をプロジェクト毎にしないといけなくなったのが面倒です
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 16:58
by シエル
toyoさん。ありがとうございます。
SDKの件、教えていただいてありがとうございます。
安心しました。
VC++2010は入れようか悩んでいましたが、面倒臭そうなので、
当分入れないようにします。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 17:01
by 御津凪
Feb 2010 は 2010年2月、
June 2010 は 2010年7月ですので、
June 2010 の方が新しいということになります。
下記が June 2010 の SDK ダウンロードページです。
http://www.microsoft.com/downloads/deta ... laylang=en
(日本語サイトでは提示がよく遅れるので、一番最新の SDK が載らないことはよくあります)
あ、書き忘れましたが、
こちらで試した環境でも例外は確認されませんでしたよ。
[Windows XP Professional SP3 (32bit), Visual Studio 2010, DirectX SDK (June 2010)]
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 17:08
by シエル
忙しい中ありがとうございます。
ダウンロードが完了したので、早速インストールして試してみます!
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 17:28
by ISLe
toyoさん
> 関係ないですがVC++2010だとこの設定をプロジェクト毎にしないといけなくなったのが面倒です
プロパティマネージャーでMicrosoft.Cpp.Win32.userに対してVC++ディレクトリを設定するとユーザー単位で設定が保存されますよ。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 18:01
by シエル
最新のSDKをインストールして、インクルードパスの設定も
チェックして、実行してみました。
が、、、、
駄目でした><
もう完全にお手上げです。。。
何か分かる方いらっしゃいましたら、ご教授願います。。。
それと、関係ないかもしれませんが、エラーが出る直前に下記のDLLを読み込むログが
出力されているようです。
まったく関連性がないかもしれませんが、一応書いておきます。
【エラー直前に出るログ】
エラー調査.exe': 'C:\Windows\System32\RpcRtRemote.dll' を読み込みました
解決しないかもしれないので、先にお礼言っておきます。
ぬるぽんさん、へろりさん、toyoさん、御津凪さん、ISLeさん、ありがとうございました!
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 18:43
by toyo
家のWindows7 32bitで
'wintest.exe': 'C:\Windows\System32\RpcRtRemote.dll' を読み込みました
wintest.exe の 0x75029617 で初回の例外が発生しました: 0x000006F4: NULL 参照ポインターがスタブに渡されました。
'wintest.exe': 'C:\Windows\System32\IME\shared\IMEAPIS.DLL' を読み込みました
wintest.exe の 0x75029617 で初回の例外が発生しました: 0x000006F4: NULL 参照ポインターがスタブに渡されました。
wintest.exe の 0x75029617 で初回の例外が発生しました: 0x000006F4: NULL 参照ポインターがスタブに渡されました。
'wintest.exe': 'C:\Windows\System32\IME\shared\imecfm.dll' をアンロード
'wintest.exe': 'C:\Windows\System32\IMJP10K.DLL' をアンロード
とでました
RPC_X_NULL_REF_POINTER
なのでRpcRtRemote.dllが怪しいですね
Vistaでは読み込まれてないdllですが何者でしょう?
ISLeさんありがとうございます
お詳しいですね。いつも感心しています。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年8月05日(木) 19:11
by シエル
toyoさんの環境でも出ましたか!
windows7の32bitだと出るんですかねぇ。
このdllをググっても英語ばかりのページしか引っかからなくて、
何者かさっぱりわかりません。
まあ、このエラーはゲームの処理が止まって動かなくなるようなエラーではないので、
最悪無視しようと思ってます。
皆さんもお忙しいと思うので、ほどほどの対応でかまいませんので。。。
Re:NULL 参照ポインターがスタブに渡されました。
Posted: 2010年9月06日(月) 04:16
by うしお
はじめまして
環境 windows7 32bit VisualStudio2010EE DirectxSDK June2010
私も同じエラーで困っていましたが、
XAudio2を使うためのCoInitializeExが原因でした。
いろいろ試行錯誤した結果、CoInitializeExの位置によって
NULL 参照ポインターがスタブに渡されました。
のエラーの有無に違いが出ているということがわかりました
どうやら、
ShowWindowを呼び出した後にCoInitializeExが呼ばれた場合
エラーのようで、
それ以前、にCoInitializeExを持ってきた場合、
エラーを消すことができました
細かいことはわかりませんが、参考になれば幸いです
DirectSoundを利用しているとのことでしたが、初期化位置になにか糸口があるかもしれません。
また、MicrosoftはDirectSoundはXAudio2に移行を推奨しているようですので、もしかすると、
そういうのも裏で関係しているのかもしれません
これを機にXAudio2に乗り換えるのも良い手段かも知れません
ああ・・・デバッグしんどかった・・・