2011-12-09 10 views
0

私は誰かがC++で作ったDLLを持っています。 VBでこのDLLを使う必要があったので、VBで呼び出せる関数を持つC++で別のdllを作らなければならなかった。VBでクラッシュするC++ DLL

私が作ったC++のDLLには4つの機能があります。 2つのコールバック関数は、元のC++から情報を取得します。そして、私はVBからその情報を送信するために呼び出すことができる2つの関数。

私はコンソールアプリケーションでそれを無限にテストしたので、元のdllはうまく動作します。

しかし、私は私のDLLとVBでそれを使用します。私はランダムクラッシュを取得します。

私のVBアプリケーションにはテストのためだけのコードはほとんどありません。それは情報を出力するだけなので、問題はありません。

私は問題が私が作ったC++のdllにあると信じています。私はC++でかなり新しいです。
私は多分変数が同時に2点でアクセスされると思いますが(これは可能でしょうか?)、それがクラッシュする原因になりますか?

私のCの相続人は基本的なレイアウト++のdll

//global variables 
CString allInfo=""; 
char* info=new char[25000]; 

//call back function 1 
HANDLE OnInfo(SendInfo* tempInfo) 
{ 
    CString stringTemp=""; 
    stringTemp=tempInfo->infomessage; 
    allInfo=allInfo+ stringTemp+"\n"; 
    return 0; 
} 

//function for vb 
BSTR _stdcall vbInfo() 
{ 
    allInfo=allInfo.Right(20000); //get last 20,000 characters 
    strcpy_s(info,20000,allInfo); 
    BSTR Message; 
    Message = SysAllocStringByteLen (info, lstrlen(info)); 
    return Message; 
} 

クラッシュは完全にランダムに発生するようです。

提案がありますか?脇のCStringクラス参照のためにグーグルでいることを学んでから

おかげ

+0

これらの関数のvb.net宣言を投稿します。 –

答えて

0

がいくつかエヘン興味深い結果を返す、あなたの問題は、おそらくのCStringの複数のアクセスであることを行っています。

多くの情報を投稿していないので、OnInfoメソッドは、vbInfoという呼び出しスレッドとは異なる実行スレッドによって呼び出されるコールバック関数であると仮定します。このケースでは、MSDNにCString::operator=()方法の説明を見てみたい:

CStringの代入(=)演算子は、新しいデータで既存のCString オブジェクトを再初期化します。宛先文字列(つまり、左の 側)が既に新しいデータを格納するのに十分な大きさであれば、新しいメモリ の割り当ては実行されません。 新しい記憶域 は、多くの場合、結果のCStringオブジェクトを保持するために割り当てられるため、代入演算子を使用するたびにメモリ例外 が発生する可能性があることに注意してください。あなたはCStringのに入れるもののサイズに制限があるように表示されません。あなたがそれを読んだり書いている一方で、それは1つの関数にallInfoでメモリの割り当てを解除して配分することができることを考えると

別の機能。あなたが突然割り当てられていないメモリに書き込もうとすると、うまくいかない。

Critical Section or a mutexのようなものを見ると、両方の機能が共通のメモリバッファを占有しないようにすることができます。

0

あなたのdllがUnicodeまたはANSI文字列を使用するようにコンパイルされているかどうかは言わなかった。他の人があなたに提供したDLLがUnicodeやANSI文字列を使用するようにコンパイルされているかどうかについては言及していません。VBの呼び出し元はおそらくあなたにUnicode文字列を与えますが、VBの呼び出し元にANSI文字列を与えることは可能です。だから、あなたのコードは、文字列がANSI文字列を指していて、Unicode文字列を指しているBSTRがバイト単位で割り当てられています。

Unicodeの使い方を説明している記事はたくさんありますが、C++を初めて熟知している人にとっては重すぎます。

あなたが他のDLLを作った人に戻って、必要な機能を追加するように頼んだ方がいいでしょう。また、VBからdllを呼び出すことになるので、Unicode文字列を処理するDLLが必要です。

関連する問題