0

我正在尝试获取指向 a 的指针string,其中指针的类型为int。我不确定我是否做得正确。我昨天才发现unsafefixed,所以我仍然对此有所质疑。我可以投到char*int?我没有收到任何错误,但这些方法不起作用,所以我不确定指针是否错误,或者我是否对第 3 方 OCX(不支持)做错了。

C++ 调用的第 3 方文档:

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*。虽然char在 C 中是 1 字节数据类型,但在 C# 中是 2 字节数据类型。AC#char*和 Cchar*是不同的、不兼容的类型。

您需要首先使用合适的文本编码将字符串转换为字节序列。我将在这里使用 UTF-8,但如果此函数不接受 UTF-8 输入,您应该切换到其他内容。

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

现在你做同样的事情,只是你使用 a byte*,它对应char*于 C 中的类型。(准确地说,它们可能在签名方面有所不同。C#byte类型是无符号的,而 Cchar类型通常是有符号的,但我们在这里并不真正关心这一点。)

// 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 回答