【发布时间】:2012-02-02 16:28:39
【问题描述】:
我有一个程序需要将数据从 C++ 传递到 C# 并返回进行处理。为此,我检索了一个结构,将其转换为字节数组,然后在另一端将其转换回。但是,在转换回来时,数据不正确,即使内存转储显示内存中每个变量的值都是相同的。
这是检索值的代码:
array<Byte> ^ GetPublicKeyBlob(String ^ ContainerName) {
const TCHAR * tContainer = context->marshal_as<const TCHAR*>(ContainerName);
HCRYPTPROV hProv = NULL;
CryptAcquireContext(&hProv, tContainer, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET);
DWORD dwKeySize = 0;
CryptExportPublicKeyInfo(hProv, AT_SIGNATURE, X509_ASN_ENCODING, NULL, &dwKeySize);
PCERT_PUBLIC_KEY_INFO pbKey = (PCERT_PUBLIC_KEY_INFO)calloc(dwKeySize, sizeof(BYTE));
CryptExportPublicKeyInfo(hProv, AT_SIGNATURE, X509_ASN_ENCODING, (PCERT_PUBLIC_KEY_INFO)pbKey, &dwKeySize);
array<Byte> ^ retVal = gcnew array<Byte>(dwKeySize);
for(int i = 0; i < dwKeySize; i++)
retVal[i] = ((BYTE*)pbKey)[i];
free(pbKey);
return retVal;
}
然后在另一端,我将其改回 PCERT_PUBLIC_KEY_INFO 结构,代码如下:
BYTE * cpiBuffer = (BYTE*)calloc(_PublicKey->Length, sizeof(BYTE));
for(int i = 0; i < _PublicKey->Length; i++)
cpiBuffer[i] = _PublicKey[i];
PCERT_PUBLIC_KEY_INFO cpi = (PCERT_PUBLIC_KEY_INFO)cpiBuffer;
在内存转储中查看它们时,pbKey、retVal、_PublicKey、cpiBuffer 和 cpi 都具有完全相同的值。但是当将 cpi 视为一个结构时,Algorithm.pszObjId 指向一些错误的内存位置,当我尝试在函数中使用它时,它会失败。我在这里做错了什么?
【问题讨论】:
-
“Algorithm.pszObjId 指向某个错误的内存位置”是什么意思?是指针吗?
-
这是一个 LPSTR。当我在手表中展开结构时,它指向一个不在结构内的内存位置,而当我得到原始值时,它指向的是结构内的一个位置。
标签: c# c++ interop c++-cli cryptoapi