![]() |
#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 |
|