我有一個程序需要將數據從C++傳遞到C#並返回進行處理。爲了做到這一點,我已經檢索了一個結構,將其轉換爲一個字節數組,然後在另一端將其轉換回來。但是,在將其轉換回來時,數據不正確,即使內存轉儲顯示每個變量的內存值都相同。傳遞結構似乎損壞數據
這裏是檢索值的代碼:
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;
當看着他們:
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結構在內存轉儲中,pbKey,retVal,_PublicKey,cpiBuffer和cpi都具有完全相同的值。但是當將cpi看作一個結構時,Algorithm.pszObjId指向一些錯誤的內存位置,當我嘗試在函數中使用它時,它會失敗。我在這裏做錯了什麼?
你是什麼意思「Algorithm.pszObjId指向一些錯誤的內存位置」?它是一個指針嗎? – 2012-02-02 16:44:13
這是一個LPSTR。當我在表中擴展結構時,它指向的不是結構內部的存儲位置,而當我獲得原始值時,它指向結構內的位置。 – 2012-02-02 16:49:49