|
21.09.2007, 18:59 | #1 |
Участник
|
Прочитать сформированный GUID
Используя API-функции формирую GUID. Но никак не могу получить это значение в символьном виде. Не понятно, где ошибка:
X++: static void get_GUID(Args _args) { #define.MAX_PATH(260) Dll ole32 = new Dll("OLE32"); DllFunction coCreateGuid = new DllFunction(ole32, "CoCreateGuid"); DllFunction stringFromGUID2 = new DllFunction(ole32, "StringFromGUID2"); Binary getGUID = new Binary(#MAX_PATH); Binary strGUID = new Binary(#MAX_PATH); int retVal; ; // Формирую сам GUID coCreateGuid.arg(ExtTypes::POINTER); coCreateGuid.returns(ExtTypes::DWORD); coCreateGuid.call(getGUID); // Теперь пытаюсь его перевести stringFromGUID2.arg(ExtTypes::POINTER, ExtTypes::POINTER, ExtTypes::DWORD); stringFromGUID2.returns(ExtTypes::DWORD); retVal = stringFromGUID2.call(getGUID,strGUID,#MAX_PATH); print "Сформированный GUID ",getGUID.string(0); // Теоретически, здесь должен получить строку "перевода", однако ничего нет. print "Перевод содержит символов ", retVal; print "Переведенный GUID ",strGUID.string(0); // Пока сделал перевод таким образом, хотя нет уверенности в его правильности print "Перевод вручную"; print int2hex(getGUID.dWord(0)), "-", int2hex(getGUID.Word(4)), "-", int2hex(getGUID.Word(4+2)), "-", int2hex(getGUID.Word(4+2+2)), "-", int2hex(getGUID.Word(4+2+2+2)), int2hex(getGUID.dWord(4+2+2+2+2)); pause; } |
|
21.09.2007, 21:00 | #2 |
Участник
|
Там OLESTR используется - юникод
X++: static void get_GUID(Args _args) { #define.MAX_PATH(260) Dll ole32 = new Dll("OLE32"); Dll krnl = new Dll("Kernel32"); DllFunction coCreateGuid = new DllFunction(ole32, "CoCreateGuid"); DllFunction stringFromGUID2 = new DllFunction(ole32, "StringFromGUID2"); DllFunction wideCharToMultiByte = new DllFunction(krnl, "WideCharToMultiByte"); Binary getGUID = new Binary(#MAX_PATH); Binary ptrGUID = new Binary(4); Binary strGUID = new Binary(#MAX_PATH); int retVal; Binary binStr; Binary ptrStr = new Binary(4); int len; ; wideCharToMultiByte.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord); wideCharToMultiByte.returns(ExtTypes::DWord); /* UINT CodePage, // code page DWORD dwFlags, // performance and mapping flags LPCWSTR lpWideCharStr, // wide-character string int cchWideChar, // number of chars in string. LPSTR lpMultiByteStr, // buffer for new string int cbMultiByte, // size of buffer LPCSTR lpDefaultChar, // default for unmappable chars LPBOOL lpUsedDefaultChar // set when default char used );*/ // Формирую сам GUID coCreateGuid.arg(ExtTypes::POINTER); coCreateGuid.returns(ExtTypes::DWORD); coCreateGuid.call(getGUID); // Теперь пытаюсь его перевести stringFromGUID2.arg(ExtTypes::POINTER, ExtTypes::POINTER, ExtTypes::DWORD); stringFromGUID2.returns(ExtTypes::DWORD); retVal = stringFromGUID2.call(getGUID,strGUID,#MAX_PATH); ptrGUID.binary(0, strGUID); len = wideCharToMultiByte.call(0, 0, ptrGUID.dWord(0), -1, 0, 0, 0, 0); binStr = new Binary( len + 1 ); ptrStr.binary(0, binStr); wideCharToMultiByte.call(0, 0, ptrGUID.dWord(0), -1, ptrStr.dWord(0), len+1, 0, 0); print "Сформированный GUID ",getGUID.string(0); print "Сформированный строковый GUID ",binStr.string(0); // Теоретически, здесь должен получить строку "перевода", однако ничего нет. print "Перевод содержит символов ", retVal; print "Переведенный GUID ",strGUID.string(0); // Пока сделал перевод таким образом, хотя нет уверенности в его правильности print "Перевод вручную"; print int2hex(getGUID.dWord(0)), "-", int2hex(getGUID.Word(4)), "-", int2hex(getGUID.Word(4+2)), "-", int2hex(getGUID.Word(4+2+2)), "-", int2hex(getGUID.Word(4+2+2+2)), int2hex(getGUID.dWord(4+2+2+2+2)); pause; }
__________________
Axapta v.3.0 sp5 kr2 |
|
24.09.2007, 11:55 | #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; } |
|