2009-11-13 3 views
1

내가 COM + 나중에 초기화 값이 구성 요소의 ConstructorString을 설정 프로그램-동맹에 노력하고있어Win7에서 COM + ConstructorString을 설정하지 못했습니다 - CryptProtectData가 변경됩니까?

업데이트되었습니다.

해당 코드는 WinXP, Win2k3, Vista 및 Win2k8에서 제대로 작동합니다.

Win7 - Home Premium 버전에서 작동하지 않습니다.

문자열을 512 자 (wchar) 이하로 저장하면 생성자 문자열에 크기 제한이있는 것으로 판단했습니다. 더 길어지고 CatalogCollection 개체의 SaveChanges 호출이 0x80110437 - COMADMIN_E_PROPERTYSAVEFAILED 오류로 실패합니다.

모든 시스템의 한계는 512 문자입니다.

우리는 CryptProtectData를 사용하여 암호를 문자열에 넣기 전에 암호화합니다.

win7 (x64)에서 문자열의 출력은 XP (x32) 및 W2k3 (x64)보다 깁니다.

그래서 CryptProtectData가 변경되었습니다. 왜 출력이 길어 집니까?

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

답변

1

당신은 문자열로 그것을 설정하는 dataOut로 무엇을 할 수 있습니까? 지금 정확한 세부 정보를 기억할 수는 없지만 생성자 문자열은 BSTR이라고 가정합니다. dataOut은 바이트 버퍼이므로 문자열로 변환 할 때 매우주의해야합니다. 따라서 내포 된 NUL 문자 등으로 이동하지 마십시오.

출력 버퍼에서 변환을 포함하도록 질문을 업데이트 할 수 있습니까? 문자열에 CryptProtectData?

+0

바이트 버퍼를 숫자 문자열 시퀀스로 변환하여 dataOut을 문자열로 바꿨습니다. 필자는 그 부분을 쓰지 않았지만 바이트가 16 자와 나머지 문자로 나뉘 었습니다. 이것은 두 배의 데이터 길이입니다. 따라서 공간이 부족합니다. 대신 ATL base64encode/base64decode 호출을 사용하도록 코드를 전환했습니다. 문자를보다 효율적으로 사용하고 문자열 내부에 맞 춥니 다. 문자열의 논리를 포함시키지 말아야합니다. 이는 독점적 인 코드이지만 결함이 있음을 인정합니다. – Eli

+0

럭키 추측이 내 부분에 도움이 되니 기쁩니다! –

관련 문제