2009-03-10 13 views
1

文字列を返す関数を持つ3番目の部分のdllがあります。 関数を呼び出すと、たとえば "123456"が返されます。少なくともそれはそのような縫い目ですが、私がミストリングしたときには長さは戻りません。ラベルのテキストプロパティを設定すると、 "123456"と表示されます。dllが文字列を正しく返さない場合の対処方法

私は私がWebサービス機能に送信DLLから得た文字列を持っている:私はから得た文字列に送るとき

rem call dll and get string 
dim mystring as string=mydll.getstring() 

rem Send it to the webservice 
webservice.SaveString(mystring) 

webexeption(「のprotocollエラー」)とWebサービスがクラッシュしますDLL。代わりに、次のように送信してください:

rem call dll and get string 
dim mystring as string=mydll.getstring() 

rem Send it to the webservice 
dim FixedString as string = mid(mystring,1,6) 
webservice.SaveString(mystring) 

それがうまくいっています。それは私がDLLから得た文字列が正しいと思われて終わっていないと思うようになります。そして、私はvb.net(私はDLLを変更することはできません)からそれを修正する方法を知りません と私は事前にどのくらいの文字列があるか分からない。

dllは特定のハードウェアが接続されている場合にのみサイトで動作しますので、私はオフィスでこれを開発環境で修正しようとすることはできません。だから私は顧客にもう一度行く前にこれに対する解決策をいくつか持っていたいと思います。

編集1: 私は(私は本当の長さを知らないので)ちょうど1から100までループループを実行しようとしましたし、新しい変数に<>「すべての文字を」コピーしようとしたが、それdidntの作業。その日が終わって顧客サイトを離れなければならなかったので、私は他のバリエーションを試しませんでした。

編集2:
DLL ImはVB6で作成されています。そのDLLはC++で作られた他のDLLと話しています(私は思っています)。

私のプログラム< - > VB6-DLL < - > C++ - DLL < - >ハードウェア

+0

あなたはそのミストリングを意味しますか?長さは何も返しません。それは整数を返します - 整数は何を返しましたか? 0? –

+0

その本当の謎。 webserviceを呼び出す前にmsgbox(mystring& ":"&mystring.length)を実行しました。msgboxには "123456:"と表示され、その後は何も表示されませんでした。どちらもクラッシュしませんでした。 – Stefan

答えて

1

文字列は約特に一部についてMSDN documentationをチェックアウト:

の.NET Framework、Stringオブジェクトでは、文字列の長さの一部としてカウント埋め込まれたヌルを含むこともできます。ただし、CやC++などの一部の言語では、ヌル文字は文字列の末尾を示し、文字列の一部と見なされず、文字列の長さの一部としてカウントされません。これは、CおよびC++プログラマまたはCまたはC++で書かれたライブラリが文字列について行う可能性がある以下の共通の前提が、Stringオブジェクトに適用されたときに必ずしも有効であるとは限りません。等しいString.Length。

strcpy_sまたはwcscpy_s関数で作成された文字列は、String.Copyメソッドで作成された文字列と必ずしも一致しません。

Stringオブジェクトをインスタンス化するネイティブのCおよびC++コード、およびプラットフォームの呼び出しを通じてStringオブジェクトに渡されるコードでは、埋め込みヌルが文字列の末尾を示すと想定しないでください。

rem call dll and get string 
dim mystring as string=string.intern(mydll.getstring()) 

代わりに、私のような何かをしたい(注:私はこれを試していない)VB6で

+0

ありがとう、悪い明日それを試してください。 – Stefan

0

一つの可能​​性は、バイトの配列に変換し、配列のサイズを取得することです。

0

文字列は.NET、BTWではNULLで終了しません。

私は、バイトに変換してバイトを見てみる上記の答えに同意します。

サードパーティが有効な文字列を返すことができない場合、プログラムをクラッシュさせないようにすることはできません。これは管理されたDLLですか、それとも管理されていないコードですか?あなたのプログラムはマルチスレッドですか、もしそうなら、このサードパーティのアンマネージDLLはマルチスレッド環境で動作しますか?その場合、そのDLLへのすべてのアクセスをシリアル化する必要があります。

+0

このDLLはVB6で作成されており、com-dllです。 – Stefan

+0

私のプログラムはマルチスレッドではありません。そして、それが私の側で修正不可能な場合、私はこれを修正する著者を得ることができる可能性があります。 – Stefan

0

文字列は、BSTRを(thisまたはGoogle for moreを参照してください)です。

BSTRsはNULLで終了することはできませんが、すべての長さを示す整数が付加されています。したがって、整数とUnicode文字の配列を含むメモリブロックへのポインタがあり、このポインタは文字列を指しますが、整数を格納する4バイトの整数があります。長さに直接アクセスするのではなく、SysStringLen()(Win32関数)を呼び出してそのような文字列の長さを取得する必要があります。

関連する問題