vba 7 - يؤدي استرداد القيم من RegQueryValueEx إلى إرجاع سلسلة Unicode

StackOverflow https://stackoverflow.com//questions/22083219

  •  24-12-2019
  •  | 
  •  

سؤال

لا أستطيع معرفة سبب عودتي لسلسلة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top