質問

私はなぜ私が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 バージョンのRegQueryValueExARegQueryValueExW)を呼び出しています。しかし、どちらの場合も、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
.

Unicodeテキストを受信するために必要な Unicode文字の必須数に事前割り当てされていること、およびRegDataバイト数の数で初期化されていることを確認してください。 lDataBufSizeに割り当てられているため、RegDataRegQueryValueExW()に書き込むことができる文字数を知っています。

アップデート:バイナリデータを読む:

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