VBA 7 - RegQueryValeExからの値の取得はUnicode文字列を返します。
質問
私はなぜ私が1文字あたりの追加文字を持つUnicode文字列を取り戻す理由を理解することができません。
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はUnicode文字列を使用していますが、 Unicode バージョン(RegQueryValueEx()
)の代わりに、 ansi バージョンのRegQueryValueExA
(RegQueryValueExW
)を呼び出しています。しかし、どちらの場合も、5番目のパラメータは生のANSI / Unicodeデータを(呼び出されたバージョンによって異なります)、6番目のパラメータは文字ではなくバイトで表されます。だからあなたはそれを説明する必要があります。また、VBAのDeclare
が常にString
値をANSIに変換するという事実を説明する必要があります。 VBAのUnicode文字列を使用してUnicode APIを使用するには、ヒントについて次の記事を参照してください。
VBA:Unicode文字列と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
.
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
. 所属していません StackOverflow