Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 14

 
Zhunko:

Посмотрел WinHttpConnect(). У неё нет реализации для многобайтовой кодировки.

Может в DLL оболочку сделать и преобразовать?


не. в DLL ненадо. понимаю, что это вариант, но как то не так...

с wininet.dll например все работет все её функции, а в Winhttp такой вот глупый стопор...

если бы можно было вызвать GetLastError из Kernel32, но mql4 вредный и не позволяет делать функции с одинаковыми именами, даже с разными параметрами...


Кстати, вы не пробовали этот скрипт на своей машине пустить? может это проблема только у меня ?

 
sergeev:

не. в DLL ненадо. понимаю, что это вариант, но как то не так...

с wininet.dll например все работет все её функции, а в Winhttp такой вот глупый стопор...

если бы можно было вызвать GetLastError из Kernel32, но mql4 вредный и не позволяет делать функции с одинаковыми именами, даже с разными параметрами...


Кстати, вы не пробовали этот скрипт на своей машине пустить? может это проблема только у меня ?

А если между GetLastError_2 и Kernel32, вставить промежуточную dll? Так разве не получится?
 
sergeev:

не. в DLL ненадо. понимаю, что это вариант, но как то не так...

с wininet.dll например все работет все её функции, а в Winhttp такой вот глупый стопор...

если бы можно было вызвать GetLastError из Kernel32, но mql4 вредный и не позволяет делать функции с одинаковыми именами, даже с разными параметрами...

GetLastError() надо вызывать низкоуровневую --> RtlGetLastWin32Error(). Ильнур подсказал в своё время. Здесь примеры пользования.

С WinHttpConnect() ничего в MQL4 не выйдет.

 
Zhunko:


С WinHttpConnect() ничего в MQL4 не выйдет.

Почему? Из-за Unsigned integer?
 

Можно попробовать конвертировать.

Если будет время, попробую наваять пример. А так... вот этот С++ код надо перегнать в MQL4:

        bool MultiByte2Unicode(const std::string& mb, std::wstring& un, UINT CodePage)
        {
                DWORD wideSize = ::MultiByteToWideChar(CodePage, 0, (LPCSTR)mb.c_str(), -1, 0, 0);

                if(wideSize != 0)
                {
                        un.reserve(wideSize);
                        std::vector<TCHAR> result(wideSize, _T('\0'));

                        bool bSucceeded = (0 != ::MultiByteToWideChar(CodePage, 0, (LPCSTR)mb.c_str(), -1, &result[0], wideSize));
                        if (bSucceeded)
                        {
                                un = &result[0];
                        }

                        return bSucceeded;
                }

                return false;
        }
wstring нужно заменить на массив интов и учитывать это при пересчете размера.
 
TheXpert:

Можно попробовать конвертировать.

Если будет время, попробую наваять пример. А так... вот этот С++ код надо перегнать в MQL4:

wstring нужно заменить на массив интов и учитывать это при пересчете размера.

У меня так:

    inline std::wstring AnsiToUnicode(const std::string &sSourceA, // Строка для преобразования.
                                      const int         nCodePage) // Кодовая страница может быть одним из значений:
                                                                   //  CP_ACP         Системное умолчание Windows кодовых страниц ANSI.
                                                                          //  CP_OEMCP       Нынешняя система OEM кода страницы.
                                                                   //  CP_MACCP       Нынешняя система Macintosh код страницы.
                                                                   //  CP_SYMBOL      Символ кода страницы (42).
                                                                   //  CP_THREAD_ACP  Код Windows ANSI страницы для текущего потока. 
                                                                   //  CP_UTF7        UTF-7. Используйте это значение только тогда, когда вынужден от транспортного механизма 7-бит. Использование UTF-8 является предпочтительным.
     {                                                             //  CP_UTF8        UTF-8.
      int          nLength = 0;
      std::wstring sStringW = L"";
      if (sSourceA.size() == 0) return(sStringW);
      if ((nLength = ::MultiByteToWideChar(nCodePage, 0, sSourceA.c_str(), -1, NULL, 0)) == 0) throw(_T("Ошибка в функции \"Utils::StringSTL::AnsiToUnicode()\". В строке отсутствуют символы."));
      sStringW.resize(nLength - 1);
      if ((nLength = ::MultiByteToWideChar(nCodePage, 0, sSourceA.c_str(), -1, LPWSTR(sStringW.c_str()), nLength)) == 0) throw(_T("Ошибка в функции \"Utils::StringSTL::AnsiToUnicode()\". Строка не преобразована."));
      return(sStringW);
           }
 
Zhunko:

У меня так:

ЕМНИП, стандарт не гарантирует расположение строки в непрерывном блоке памяти, поэтому использование конструкции &sStringW[0] чревато.

В общем те же яйца. Но у меня на 100% по стандарту :)

 
TheXpert:

ЕМНИП, стандарт не гарантирует расположение строки в непрерывном блоке памяти, поэтому использование конструкции &sStringW[0] чревато.

В общем те же яйца. Но у меня на 100% по стандарту :)

Не знал...
 
Zhunko:
Не знал...
Ну вроде у мелкософтовских реализаций (у всех наверное) с этим все в порядке, за остальные не ручаюсь.
 
TheXpert:
Ну вроде у мелкософтовских реализаций (у всех наверное) с этим все в порядке, за остальные не ручаюсь.
Пока проблем не было. Код свой поправил под стандарт.
Причина обращения: