NULL 参照ポインターがスタブに渡されました。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シエル

NULL 参照ポインターがスタブに渡されました。

#1

投稿記事 by シエル » 15年前

お世話になります。

デバッグをしていて、「*******で初回の例外が発生しました: *******: NULL 参照ポインターがスタブに渡されました。」
というエラーが右下のログを表示する部分に表示されていることが分かりました。
アスタリスクの部分にはメモリアドレスのようなものが書いてあります。
このようなログは表示されているのですが、ゲームの処理には支障はなく、普通にプレイできます。

ですが、エラーは全て消しておきたいので、このエラーを解消したいと思っています。
手がかりがメモリアドレスだけで、ゲームに支障がないので、どこが原因なのか分からず困っています。
このようなエラーの場合、どこが原因なのかを突き止めるにはどうデバッグすればよろしいでしょうか?
皆さんのお力をお貸し下さい。

よろしくお願い致します!



追記:
コンパイラはvisual c++ 2008EEで、OSはwindows7です。 画像

めるぽん

Re:NULL 参照ポインターがスタブに渡されました。

#2

投稿記事 by めるぽん » 15年前

そのエラーは RPC 経由のエラー(RPC_X_NULL_REF_POINTER)ですね。
COM を使ってる部分(多分 DirectX ですかね?)で NULL になってはいけない引数が NULL になってしまっているようです。
DX ライブラリ経由で DirectX を呼び出しているのであれば、DX ライブラリに不要な NULL を渡していないかチェックして、DirectX を直接呼び出しているのであれば、DirectX に不要な NULL を渡していないかチェックしましょう。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#3

投稿記事 by シエル » 15年前

ぬるぽんさん!ありがとうございます。
DirectXで開発しています。
NULLを渡すとまずい部分にNULLを渡すと出てしまうエラーですか。勉強になります!
実はウィンドウをアクティブにするたびに出るんですよね。。。
描画部分かキー入力周りを片っ端から調べてみます!

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#4

投稿記事 by シエル » 15年前

う~ん。探してみたんですが見つからない;

メモリアドレスからどうにかして原因箇所を割り出す方法はないですかね?

めるぽん

Re:NULL 参照ポインターがスタブに渡されました。

#5

投稿記事 by めるぽん » 15年前

そういえば例外投げた瞬間に捕捉する機能が VS にあったようなって調べてみたら、ありました。

http://msdn.microsoft.com/ja-jp/library/d14azbfh.aspx

1. [デバッグ] メニューの [例外] をクリックします。
2. [例外] ダイアログ ボックスで、例外の全体カテゴリの [スローされるとき] を選択します (たとえば、[Common Language Runtime Exceptions] など)。

だそうです。これで COM のエラーを捕捉できるかどうかは分かりませんけど、とりあえず全部にチェックを入れてやってみるといいかもしれません。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#6

投稿記事 by シエル » 15年前

ぬるぽんさん!ありがとうございました!
例外を補足できて、原因箇所が分かりました!
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 参照ポインターがスタブに渡されました。

#7

投稿記事 by めるぽん » 15年前

そうなるとちょっと今の段階では分からないですね。
現象の再現するコードと、再現手順があるといいかもしれません。

へろりくしょん

Re:NULL 参照ポインターがスタブに渡されました。

#8

投稿記事 by へろりくしょん » 15年前

ディスパッチされたプロシージャの中でエラーが起きてるとかそういうのは無いですか。
ウィンドウをアクティブにするたびに出るということですから、WM_ACTIVATE あたりとか。

エラーが起きる時の msg の中身を記録したりして、プロシージャの中身まで掘り下げていった方がいいかもしれませんね。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#9

投稿記事 by シエル » 15年前

すいません。全部のコードを載せるわけにはいかないので、
今再現するコードを作成中です。

が、再現しない;
やっぱりゲームメインの処理も関係してるのかなぁ。。。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#10

投稿記事 by シエル » 15年前

>>へろりさん
ありがとうございます。

ウィンドウプロシージャで制御してるメッセージは下記のコードだけなんですよね。。。
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 参照ポインターがスタブに渡されました。

#11

投稿記事 by シエル » 15年前

エラーが出る際の、MSG構造体のmessageメンバの値は「275」でした。
現在調査中です。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#12

投稿記事 by シエル » 15年前

すいません。再現するコードを作っていると、
どうやらDirectsoundの初期化処理をスキップするとエラーが出なくなったので、
もう一度Directsoundの処理を見直してみます。
なので一旦忘れてください。
一応エラーが解消されたら、解決にします。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#13

投稿記事 by シエル » 15年前

すいません。やっぱりわかりません。。。
再現するコードが作成できたので貼ります。
ダイレクトサウンドを初期化して、解放するだけのコードです。
よろしくお願いいたします。

#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);
}

toyo

Re:NULL 参照ポインターがスタブに渡されました。

#14

投稿記事 by toyo » 15年前

私の環境では再現しませんね
例外は出ませんでした
VC++2008 VC++2010EE vista 32bitです

ひょっとして7は64ビットOSでしょうか(EEだと64ビット版はコンパイルできませんよね)

へろりくしょん

Re:NULL 参照ポインターがスタブに渡されました。

#15

投稿記事 by へろりくしょん » 15年前

Windows7 Visual Studio .NET 2003 再現しません。

DirectXはさっぱり分かりませんが、DirectX9 SDK 入ってます。

めるぽん

Re:NULL 参照ポインターがスタブに渡されました。

#16

投稿記事 by めるぽん » 15年前

自分の環境でも出なかったです。

WindowsXP
Visual Studio 2008 Standard Edition
DirectX SDK (February 2010)

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#17

投稿記事 by シエル » 15年前

皆さんの環境では再現しませんか;
私の環境がまずいのかなぁ。困りましたね。
原因がまったく分からないです。

ちなみに、
OSはWindows7 Home Premiumの32ビットOSです。
SDKはNovember 2008です。

一応デバッグ時の画面を貼っておきます。

何か分かる方、ご教授よろしくお願い致します。

御津凪

Re:NULL 参照ポインターがスタブに渡されました。

#18

投稿記事 by 御津凪 » 15年前

プロジェクトのプロパティは(インクルードパスとかビルドに必須な個所を除いて)何もいじってないのですよね?
デフォルトから何かいじっているのならそれを書いた方がいいかもしれません。

ですがその前に、 SDK を最新のものにしてみてください。(現段階では June 2010 が最新)
SDK ごとに使用されるランタイムも違うので、もしかしたらそれで解消されるかもしれませんよ。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#19

投稿記事 by シエル » 15年前

御津凪さん。ありがとうございます!

プロパティは何もいじっていません。

一応念のため聞きますが、SDKを最新にしても、
今まで通りのコードでプログラムは組めますでしょうか?
一応これ以外にもD3DやDirectinputなどのコードもたくさん書いているので、
更新したら、いきなりコンパイルできなくなった~なんてことないですよね?

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#20

投稿記事 by シエル » 15年前

あ、ちなみにランタイムだけは一週間前ぐらいには更新しました。

御津凪

Re:NULL 参照ポインターがスタブに渡されました。

#21

投稿記事 by 御津凪 » 15年前

推薦されなくなった機能(DirectMusicや、DirectX9の一部の関数など)が新しい SDK でなくなっていることはありますが、
必要だと思っていた機能が使えなくなるようなことは一部を除いてほとんどありません。
(一部というのは MIDI が再生できていた DirectMusic のこととか)

最新の SDK をインストールしても、前の SDK をアンインストールしなければ、
インクルードパス・ライブラリパスを切り替えるだけで問題ないので、何かしらコンパイルできないなどの問題が
あってもすぐに使用する SDK を戻すことができます。

なお、使用している SDK に対応したランタイムを使用するので、ランタイムの更新だけではランタイムにバグがあった場合を除き改善することはありません。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#22

投稿記事 by シエル » 15年前

SDKを最新にしてみることにします。

ところで、SDKは、JUNE 2010が最新なのでしょうか。
下記ページでは、February 2010が最新と出ているのですが、
ページが間違っているのでしょうか?

http://msdn.microsoft.com/ja-jp/directx/aa937788.aspx

toyo

Re:NULL 参照ポインターがスタブに渡されました。

#23

投稿記事 by toyo » 15年前

複数のDXSDKをインストールするのは問題ないです
設定で優先順位が変えられるので一番上に持っていくだけでいいですよ
私はこれだけ入れてます

関係ないですがVC++2010だとこの設定をプロジェクト毎にしないといけなくなったのが面倒です

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#24

投稿記事 by シエル » 15年前

toyoさん。ありがとうございます。

SDKの件、教えていただいてありがとうございます。
安心しました。

VC++2010は入れようか悩んでいましたが、面倒臭そうなので、
当分入れないようにします。

御津凪

Re:NULL 参照ポインターがスタブに渡されました。

#25

投稿記事 by 御津凪 » 15年前

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 参照ポインターがスタブに渡されました。

#26

投稿記事 by シエル » 15年前

忙しい中ありがとうございます。

ダウンロードが完了したので、早速インストールして試してみます!

ISLe

Re:NULL 参照ポインターがスタブに渡されました。

#27

投稿記事 by ISLe » 15年前

toyoさん
> 関係ないですがVC++2010だとこの設定をプロジェクト毎にしないといけなくなったのが面倒です

プロパティマネージャーでMicrosoft.Cpp.Win32.userに対してVC++ディレクトリを設定するとユーザー単位で設定が保存されますよ。

シエル

Re:NULL 参照ポインターがスタブに渡されました。

#28

投稿記事 by シエル » 15年前

最新のSDKをインストールして、インクルードパスの設定も
チェックして、実行してみました。

が、、、、

駄目でした><

もう完全にお手上げです。。。
何か分かる方いらっしゃいましたら、ご教授願います。。。

それと、関係ないかもしれませんが、エラーが出る直前に下記のDLLを読み込むログが
出力されているようです。
まったく関連性がないかもしれませんが、一応書いておきます。

【エラー直前に出るログ】
エラー調査.exe': 'C:\Windows\System32\RpcRtRemote.dll' を読み込みました


解決しないかもしれないので、先にお礼言っておきます。
ぬるぽんさん、へろりさん、toyoさん、御津凪さん、ISLeさん、ありがとうございました!

toyo

Re:NULL 参照ポインターがスタブに渡されました。

#29

投稿記事 by toyo » 15年前

家の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 参照ポインターがスタブに渡されました。

#30

投稿記事 by シエル » 15年前

toyoさんの環境でも出ましたか!

windows7の32bitだと出るんですかねぇ。
このdllをググっても英語ばかりのページしか引っかからなくて、
何者かさっぱりわかりません。

まあ、このエラーはゲームの処理が止まって動かなくなるようなエラーではないので、
最悪無視しようと思ってます。

皆さんもお忙しいと思うので、ほどほどの対応でかまいませんので。。。

うしお

Re:NULL 参照ポインターがスタブに渡されました。

#31

投稿記事 by うしお » 15年前

はじめまして

環境 windows7 32bit VisualStudio2010EE DirectxSDK June2010

私も同じエラーで困っていましたが、
XAudio2を使うためのCoInitializeExが原因でした。

いろいろ試行錯誤した結果、CoInitializeExの位置によって
NULL 参照ポインターがスタブに渡されました。
のエラーの有無に違いが出ているということがわかりました

どうやら、
ShowWindowを呼び出した後にCoInitializeExが呼ばれた場合
エラーのようで、
それ以前、にCoInitializeExを持ってきた場合、
エラーを消すことができました

細かいことはわかりませんが、参考になれば幸いです
DirectSoundを利用しているとのことでしたが、初期化位置になにか糸口があるかもしれません。
また、MicrosoftはDirectSoundはXAudio2に移行を推奨しているようですので、もしかすると、
そういうのも裏で関係しているのかもしれません
これを機にXAudio2に乗り換えるのも良い手段かも知れません
ああ・・・デバッグしんどかった・・・

閉鎖

“C言語何でも質問掲示板” へ戻る