- - PR -
VCで作成したDLLコールでNullReferenceExceptionが発生する
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-11-10 18:25
いつも参考にさせていただいてます。
VB.NET 2003 からVCで作成したDLLを呼び出しています。 VB.NET側でDLLを呼び出すために、クラスの先頭で、 Private Declare Function VCMAIN _ Lib "VCDLL" Alias "VCMAIN" (ByRef ByVallpReturnedString As Byte) As Int32 と宣言しています。 VB.NET側でそれを利用するときは、 Call VCMAIN(bytepara(0)) で、呼び出しています。 通常呼び出している分には、なんら問題がないのですが、 数十回連続で呼び出していると、NullReferenceException が発生することがあります。 必ず発生するわけではなく、例外が発生するときがあるという状態です。 VCを呼び出している処理は、クラス化されており、インスタンスの生成をすることで、 利用可能となります。 例外が発生する場合があるという、曖昧な状態であるため、どこの処理を見直せば いいかがわからない状態です。 もし何か分かる方がいましたら、ご教示願います。 [ メッセージ編集済み 編集者: ガーリック 編集日時 2006-11-10 18:25 ] | ||||
|
投稿日時: 2006-11-10 18:49
DLL側のソースを載せてくれなきゃ見当つくわけないっしょ。 | ||||
|
投稿日時: 2006-11-10 19:35
失礼しました。クラサバでTCPIP通信をしています。
クラアント側の処理です。 必要そうなところだけピックアップしました。 やってることは、APLで設定されたバイナリデータをサーバへ送信後、 サーバから受信したデータをAPLに返すという処理をしています。 (一定時間待機してもデータが受信できない場合は、異常終了する) LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { /* 初期処理発生処理 */ case WM_START: TcpipSend(); break; /* ソケットイベント処理 */ case WM_SOCKET_EVENT: Socket_Event( wParam, lParam ); break; /* タイマ処理 */ case WM_TIMER: 使用しているタイマ削除 ソケット破棄処理 DestroyWindow(hWnd); break; /* 終了処理 */ case WM_DESTROY: PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } void SocketSend() { <中略> send を使用した単純な送信処理 } void Socket_Event(WPARAM wParam, LPARAM lParam) { if(WSAGETSELECTERROR(lParam) != 0) { } else { switch(WSAGETSELECTEVENT(lParam)) { case FD_CLOSE: //クローズイベント ソケット破棄 DestroyWindow(hWnd); break; case FD_READ: //リードイベント <中略> Recv を使用した受信処理 受信データをメモリへ展開 タイマ終了 ソケット破棄 DestroyWindow(hWnd); break; } } } [ メッセージ編集済み 編集者: ガーリック 編集日時 2006-11-10 19:37 ] | ||||
|
投稿日時: 2006-11-10 20:01
ソースをはっきり読んでいませんが、NullReferenceException は DLL 内から発生?使用側から発生?
どちらにしろ、ある程度のスタックトレースぐらいは出てるはずなのでそれを見せてください。 知識不足で申し訳ないのですが、APL って何です? _________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2006-11-11 14:57
囚人さん、返信ありがとうございます。
Application の略称で、APLって書いてました。 失礼しました。いつもの癖で、すみません。 ここでいうAPLとは、VB.NETの事でした。 .NET側で発生しているものと考えていましたので、 .NET側で発生しているのか、DLL内で発生しているのか 確かに切り分けをしてませんでした。 すみません スタックトレースって、なんぞや?っていうところなんですが、 IDEでデバッグ出力されるものでしょうか。。。 [ メッセージ編集済み 編集者: ガーリック 編集日時 2006-11-11 14:58 ] | ||||
|
投稿日時: 2006-11-11 15:30
Exception.StackTrace のことです。 エラーがどこで発生したのかを突き止めるための、物凄く重要な情報です。 なんとなーく、.dll 内で SHE が発生しているのを .NET が捕捉しているよーな気がする。 | ||||
|
投稿日時: 2006-11-11 16:27
渋木宏明(ひどり)さん アドバイスありがとうございます。
Catch した例外のStackTraceですね。 すみません、今すぐ出せないので、追って掲示します。 そこの部分、Try 〜 Catch してなかったかもです。 ちゃんとTry 〜 Catch して確認します。 | ||||
|
投稿日時: 2006-11-12 01:17
とのことですが、 [quote] Private Declare Function VCMAIN _ Lib "VCDLL" Alias "VCMAIN" (ByRef ByVallpReturnedString As Byte) As Int32 [quote] で定義されている VCMAIN と、例示された WndProc の関係がまるで分かりません。 |