Показать сообщение отдельно
Старый 21.09.2007, 21:00   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Там 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 Вручную неправильно переводится
__________________
Axapta v.3.0 sp5 kr2