2009-11-13 32 views
1

修訂未能在Win7上設置COM + ConstructorString - CryptProtectData更改?

我想綱領性盟友設置一個COM +組件,以便後面的初始化值ConstructorString。

有問題的代碼在WinXP,Win2k3,Vista和Win2k8上正常工作。

我在Win7 - 家庭高級版上失敗。

我已經通過試驗和錯誤確定似乎有構造函數字符串的大小限制 - 如果字符串是512個字符(wchar)或更少,它會保存。更長,並且CatalogCollection對象上的SaveChanges調用失敗,並出現0x80110437 - COMADMIN_E_PROPERTYSAVEFAILED錯誤。

原來,所有系統都有這個限制 - 512個字符。

在將密碼放入字符串之前,我們使用CryptProtectData來加密密碼。

在win7(x64)上,字符串的輸出比XP(x32)和W2k3(x64)長。

So - CryptProtectData已經改變 - 爲什麼輸出時間更長?

if (!CryptProtectData(&dataIn,L" ",&optionalEntropy,NULL,NULL, 
    CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &dataOut)) 

回答

1

你怎麼用dataOut把它變成一個字符串?我現在不記得確切的細節,但我假設構造函數字符串是BSTRdataOut是一個字節的緩衝區,所以你需要將其轉換爲字符串時要非常小心,所以你不上內嵌的NULL字符跳閘等

你能更新您的問題,包括從輸出緩衝器的轉換CryptProtectData要串?

+0

通過將字節緩衝區轉換爲數字字符串序列,將dataOut轉換爲字符串。 我沒有寫這部分,但它看起來像字節被分割成16個字符和一個餘數字符的冪。 這是數據輸出翻倍的兩倍 - 因此空間不足。 我將代碼切換爲使用ATL base64encode/base64decode調用代替 - 更有效地使用字符,它適合字符串內部。 我寧願不包括字符串的邏輯 - 它是專有代碼,但我承認它是有缺陷的。 – Eli 2009-11-17 18:33:13

+0

幸運的猜測我的部分,很高興它幫助! – 2009-11-17 20:16:26