Там 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;
}
PS Вручную неправильно переводится