0

へのポインターを取得しようとしていますstringが、ポインターのタイプはintです。私はそれを正しく行っているかどうかわかりません。unsafefixedについて昨日知ったばかりなので、まだ少し疑問があります。char*to をキャストできますintか?エラーは発生していませんが、メソッドが機能していないため、ポインターが間違っているのか、サードパーティの OCX (サポートされていない) で何か間違っているのかわかりません。

C++ 呼び出しに関するサードパーティのドキュメント:

BlobToVariant(VARIANT *pV, long BlobPointer)
WriteVToFile(VARIANT *pV)

VS2010 C# Intellisense のコメント:

BlobToVariant(ref object v, int BlobPointer)
WriteVToFile(ref object v)

これが私のコードです:

string imageBlob = "superlongstring";

// 3rd Party ActiveX control for tiff image files
TIFFLib.TIFF tiff = new TIFFLib.TIFF();

// Variant object that will hold image
object blobVariant = new object();

unsafe
{
    fixed (char* p = imageBlob)
    {
        int blobPointer = (int)p;

        tiff.BlobToVariant(ref blobVariant, blobPointer);
        tiff.WriteVToFile(ref blobVariant);
    }
}
4

1 に答える 1

1

BlobToVariantおそらくC文字列へのポインタを期待しています。char*。_ C では 1 バイトのデータ型ですがchar、C# では 2 バイトのデータ型です。AC#char*と Cchar*は異なる、互換性のない型です。

最初に、適切なテキスト エンコーディングを使用して、文字列を一連のバイトに変換する必要があります。ここでは UTF-8 を使用しますが、この関数が UTF-8 入力を受け入れない場合は別のものに切り替える必要があります。

// "using System.Text;" assumed.
byte[] imageBlobBytes = Encoding.UTF8.GetBytes(imageBlob);

これで、以前と同じことを行います。Cbyte*の型に対応するa を使用するだけですchar*(正確には、符号の有無が異なる場合があります。C# のbyte型は符号なしで、C のchar型は通常符号付きです)。 、しかしここではあまり気にしません。)

// 3rd Party ActiveX control for tiff image files
TIFFLib.TIFF tiff = new TIFFLib.TIFF();

// Variant object that will hold image
object blobVariant = new object();

unsafe
{
    fixed (byte* p = imageBlobBytes)
    {
        int blobPointer = (int)p;

        tiff.BlobToVariant(ref blobVariant, blobPointer);
        tiff.WriteVToFile(ref blobVariant);
    }
}

これは、32 ビットのホスト、またはプロセスが 32 ビットとして実行されている場合は 64 ビットのホストでのみ機能することに注意してください。 C#int型は常に 32 ビット幅ですbyte*が、32 ビット実行環境では 32 ビット幅、64 ビット実行環境では 64 ビット幅になります。64 ビット環境で実行すると、このコードはポインターを切り捨て、結果の動作は未定義になります。

于 2012-10-17T19:05:08.887 に答える