![]() |
#3 |
Участник
|
Спасибо за "наводку" с UNICOD. После устранения ненужного дублирования ссылок получилcя такой код:
X++: static void get_GUID(Args _args) { #define.MAX_PATH(260) Dll ole32, kernel32; DllFunction coCreateGuid, stringFromGUID2, wideCharToMultiByte; Binary getGUID, getUnicodeCUID, getStrGUID; int lenGUID, lenConvert, isNotOk; ; // Используемые DLL-библиотеки ole32 = new Dll("OLE32"); kernel32 = new Dll("Kernel32"); // Определение параметров и возвращаемых значений API-функций // CoCreateGuid - собственно формирование GUID coCreateGuid = new DllFunction(ole32, "CoCreateGuid"); coCreateGuid.arg(ExtTypes::POINTER); // GUID* pguid // [out] Pointer to the requested GUID on return // Return Value // S_OK - The GUID was successfully created // Microsoft Win32® errors are returned by UuidCreate but wrapped as an HRESULT coCreateGuid.returns(ExtTypes::DWORD); // StringFromGUID2 - конвертация сформированного GUID в строку в формате UNICOD stringFromGUID2 = new DllFunction(ole32, "StringFromGUID2"); stringFromGUID2.arg(ExtTypes::POINTER, // REFGUID rguid // [in] GUID to be converted ExtTypes::POINTER, // LPOLESTR lpsz // [out] Pointer to a caller-allocated string variable to contain the resulting string on return ExtTypes::DWORD); // int cchMax // [in] Number of characters available in the buffer indicated by lpsz // Return Value // 0 (zero) - Array at lpsz is too small to contain a string representation of a GUID. // Non-zero value - The number of bytes (not characters) in the returned string, including the null terminator. stringFromGUID2.returns(ExtTypes::DWORD); // WideCharToMultiByte - преобразование строки из UNICOD в строку текущей кодовой страницы // Если соответсвующие флаги не установлены (равны 0), то используются текущие настройки системы wideCharToMultiByte = new DllFunction(kernel32, "WideCharToMultiByte"); wideCharToMultiByte.arg(ExtTypes::DWord, // UINT CodePage, // [in] Code page to use in performing the conversion ExtTypes::DWord, // DWORD dwFlags, // [in] Flags indicating the conversion type ExtTypes::POINTER, // LPCWSTR lpWideCharStr, // [in] Pointer to the wide character string to convert ExtTypes::DWord, // int cchWideChar, // [in] Size, in WCHAR values, of the string indicated by lpWideCharStr ExtTypes::POINTER, // LPSTR lpMultiByteStr, // [out] Pointer to a buffer that receives the converted string ExtTypes::DWord, // int cbMultiByte, // [in] Size, in bytes, of the buffer indicated by lpMultiByteStr ExtTypes::DWORD, // LPCSTR lpDefaultChar, // [in] Pointer to the character to use if a wide character cannot be represented in the specified code page ExtTypes::DWord); // LPBOOL lpUsedDefaultChar // [out] Pointer to a flag that indicates if the function has used a default character in the conversion // Return value // Returns the number of bytes written to the buffer pointed to by lpMultiByteStr if successful. The number includes the byte for the terminating null character // If the function succeeds and cbMultiByte is 0, the return value is the required size, in bytes, for the buffer indicated by lpMultiByteStr // The function returns 0 if it does not succeed wideCharToMultiByte.returns(ExtTypes::DWord); // Формирую сам GUID getGUID = new Binary(#MAX_PATH); isNotOk = coCreateGuid.call(getGUID); if (isNotOk) { throw error(strFmt("При попытке сформировать GUID произошла ошибка %1", isNotOk)); } // Перевожу в строку UNICOD getUnicodeCUID = new Binary(#MAX_PATH); lenGUID = stringFromGUID2.call(getGUID,getUnicodeCUID,#MAX_PATH); if (! lenGUID) { throw error("В буфере выделено недостаточно места для сформированной строки"); } // Перевожу UNICOD в текущую кодовую страницу // Поскольку содержимое строки GUID - это код в 16-ричной системе, // то количество знаков в строке UNICOD будет совпадать с количеством символов в текущей кодовой странице // Поэтому нет необходимости в предварительном вычислении длины формируемой строки getStrGUID = new Binary(lenGUID); lenConvert = wideCharToMultiByte.call(0, 0, getUnicodeCUID, lenGUID, getStrGUID, lenGUID, 0, 0); if (! lenConvert) { throw error(strFmt("При переводе сформированной строки из UNICOD в текущую кодовую страницу произошла ошибка %1", WinApi::getLastError())); } print "Сформированный GUID ",getGUID.string(0); print "GUID переведенный в UNICOD содержит символов (включая null-terminate) ", lenGUID; print "GUID в текущей кодовой странице ",getStrGUID.string(0); print "Содержит символов (включая null-terminate) ", lenConvert; pause; } |
|