문제

문자 당 추가 문자로 유니 코드 문자열을 다시 가져 오는 이유를 알아낼 수 없습니다.

Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll"
Alias "RegQueryValueExA" (ByVal hKey As LongPtr, ByVal lpValueName As String,
                          ByVal lpReserved As LongPtr, lpType As LongPtr,
                          lpData As Any, lpcbData As LongPtr) As LongPtr


If RegQueryValueEx(hKey, strValueName, 0, dwType,
                   ByVal RegData, lDataBufSize) = ERROR_SUCCESS Then
End If
.

regdata에는 다음 값이 있습니다 "모바일 주소록" 그러나 메모장에서 그 값을 붙여 넣으면 모든 추가 문자가 표시됩니다.문자열을 ASCII로 변환해야합니까?

도움이 되었습니까?

해결책

VBA는 유니 코드 문자열을 사용하지만 유니 코드 버전 대신 RegQueryValueEx() (RegQueryValueExA)의 ansi 버전을 호출합니다. 그러나 두 경우 모두 5 번째 매개 변수는 원시 ANSI / 유니 코드 데이터 (버전에 따라 다름)를 받고 6 번째 매개 변수는 문자 가 아닌 바이트 에서 표현됩니다. 그래서 당신은 그것을 설명해야합니다. VBA의 RegQueryValueExW가 항상 ANSI로 ANSI로 변환하는 사실을 고려해야합니다. VBA에서 유니 코드 문자열을 사용하여 유니 코드 API로 작업하려면 다음 문서를 참조하십시오.

VBA : 유니 코드 문자열 및 Windows API < / a>

예 :

Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll"
Alias "RegQueryValueExW" (ByVal hKey As LongPtr, ByVal lpValueName As LongPtr,
                          ByVal lpReserved As LongPtr, lpType As LongPtr,
                          ByVal lpData As LongPtr, lpcbData As LongPtr) As LongPtr


If RegQueryValueEx(hKey, StrPtr(strValueName), 0, dwType,
                   StrPtr(RegData), lDataBufSize) = ERROR_SUCCESS Then
End If
.

바이트 의 수로 Declare가 초기화 된 유니 코드 문자 의 필수 수에 미리 할당되었는지 확인하십시오. String에서 RegDatalDataBufSize에 쓸 수있는 문자 수를 알고 있습니다.

update : 바이너리 데이터를 읽으려면 :

Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll"
Alias "RegQueryValueExW" (ByVal hKey As LongPtr, ByVal lpValueName As LongPtr,
                          ByVal lpReserved As LongPtr, lpType As LongPtr,
                          lpData As Byte, lpcbData As LongPtr) As LongPtr


Dim RegData() As Byte
...
If RegQueryValueEx(hKey, StrPtr(strValueName), 0, dwType,
                   RegData(0), lDataBufSize) = ERROR_SUCCESS Then
End If
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top