vba 7 - يؤدي استرداد القيم من RegQueryValueEx إلى إرجاع سلسلة Unicode
سؤال
لا أستطيع معرفة سبب عودتي لسلسلة 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 القيمة التالية "دفتر عناوين الهاتف المحمول" ولكن إذا قمت بصق ذلك في Notepad ، فسترى جميع الشخصيات الإضافية.هل أحتاج إلى تحويل السلسلة إلى ascii؟
المحلول
يستخدم VBA سلاسل Unicode، ولكنك تقوم باستدعاء أنسي نسخة من RegQueryValueEx()
(RegQueryValueExA
) بدلا من ال يونيكود إصدار (RegQueryValueExW
).ولكن في كلتا الحالتين، ستتلقى المعلمة الخامسة بيانات Ansi/Unicode الأولية (اعتمادًا على الإصدار المسمى) ويتم التعبير عن المعلمة السادسة في بايت, ، ليس في الشخصيات.لذا عليك أن تحسب ذلك.عليك أيضًا أن تأخذ في الاعتبار حقيقة ذلك Declare
في VBA يتم التحويل دائمًا String
القيم إلى Ansi، وليس إلى Unicode أبدًا.للعمل مع Unicode APIs باستخدام سلاسل Unicode في VBA، قم بإلقاء نظرة على المقالة التالية للحصول على تلميحات:
فبا:سلاسل Unicode وواجهة برمجة تطبيقات Windows
على سبيل المثال:
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
فقط تأكد من ذلك RegData
يتم تخصيصها مسبقًا للعدد المطلوب من أحرف يونيكود اللازمة لتلقي نص Unicode، وذلك lDataBufSize
تتم التهيئة مع عدد بايت المخصصة في RegData
لذا RegQueryValueExW()
يعرف عدد الأحرف التي يمكنه الكتابة فيها RegData
.
تحديث:لقراءة البيانات الثنائية:
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