- PR -

VCで作成したDLLコールでNullReferenceExceptionが発生する

投稿者投稿内容
ガーリック
常連さん
会議室デビュー日: 2005/05/24
投稿数: 22
投稿日時: 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 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-11-10 18:49
引用:

ガーリックさんの書き込み (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 ]


DLL側のソースを載せてくれなきゃ見当つくわけないっしょ。
ガーリック
常連さん
会議室デビュー日: 2005/05/24
投稿数: 22
投稿日時: 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 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-11-10 20:01
ソースをはっきり読んでいませんが、NullReferenceException は DLL 内から発生?使用側から発生?
どちらにしろ、ある程度のスタックトレースぐらいは出てるはずなのでそれを見せてください。

知識不足で申し訳ないのですが、APL って何です?
_________________
囚人のジレンマな日々
ガーリック
常連さん
会議室デビュー日: 2005/05/24
投稿数: 22
投稿日時: 2006-11-11 14:57
囚人さん、返信ありがとうございます。

Application の略称で、APLって書いてました。
失礼しました。いつもの癖で、すみません。

ここでいうAPLとは、VB.NETの事でした。

.NET側で発生しているものと考えていましたので、
.NET側で発生しているのか、DLL内で発生しているのか
確かに切り分けをしてませんでした。

すみません
スタックトレースって、なんぞや?っていうところなんですが、
IDEでデバッグ出力されるものでしょうか。。。


[ メッセージ編集済み 編集者: ガーリック 編集日時 2006-11-11 14:58 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-11-11 15:30
引用:

スタックトレースって、なんぞや?っていうところなんですが、



Exception.StackTrace のことです。
エラーがどこで発生したのかを突き止めるための、物凄く重要な情報です。

なんとなーく、.dll 内で SHE が発生しているのを .NET が捕捉しているよーな気がする。
ガーリック
常連さん
会議室デビュー日: 2005/05/24
投稿数: 22
投稿日時: 2006-11-11 16:27
渋木宏明(ひどり)さん アドバイスありがとうございます。

Catch した例外のStackTraceですね。
すみません、今すぐ出せないので、追って掲示します。

そこの部分、Try 〜 Catch してなかったかもです。
ちゃんとTry 〜 Catch して確認します。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-11-12 01:17
引用:

必要そうなところだけピックアップしました。



とのことですが、

[quote]
Private Declare Function VCMAIN _
Lib "VCDLL" Alias "VCMAIN" (ByRef ByVallpReturnedString As Byte) As Int32
[quote]

で定義されている VCMAIN と、例示された WndProc の関係がまるで分かりません。

スキルアップ/キャリアアップ(JOB@IT)