从专业人员到超级专业人员的任何问题 - 1。 - 页 14

 
Zhunko:

看了一下WinHttpConnect()。它没有多字节编码的实现。

我可以用一个DLL来加壳和转换吗?


不,我不需要它在DLL中,我知道这是一个选项,但这是错误的...

wininet.dll的所有功能都能工作,但Winhttp有这样一个愚蠢的错误......

如果你可以从Kernel32中调用GetLastError,但是mql4是有害的,不允许制作名称相同的函数,即使参数不同...


顺便问一下,你有没有试着在你的机器上运行这个脚本? 也许这只是我的问题?

 
sergeev:

我明白这是一个选择,但这不一样...

例如,它的所有功能都与wininet.dll一起工作,但在Winhttp中却有这样一个愚蠢的停滞。

如果你可以从Kernel32中调用GetLastError,但是mql4是有害的,不允许制作名称相同的函数,即使参数不同...


顺便问一下,你有没有试着在你的机器上运行这个脚本? 也许这只是我的问题?

如果你在GetLastError_2和Kernel32 之间插入一个中间的dll呢? 这不就可以了吗?
 
sergeev:

我明白这是一个选项,但它并不是那样运作的......

例如,wininet.dll,它的所有功能都能工作,但Winhttp有这样一个愚蠢的停顿。

如果你可以从Kernel32中调用GetLastError,但是mql4是有害的,不允许制作名称相同的函数,即使参数不同...

GetLastError()应该被低级别调用 -->RtlGetLastWin32Error()。伊尔努尔在他的时代就建议这样做。这里有一些如何使用它的例子。

WinHttpConnect()MQL4 中不会工作。

 
Zhunko:


MQL4 中,没有任何东西能与WinHttpConnect() 一起工作。

为什么?因为是无符号整数?
 

你可以尝试转换

如果我有时间,我将尝试做一个例子。否则...这个C++代码应该被转换为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应该被替换成一个ints数组,在重新计算大小时应该考虑到这一点。
 
TheXpert:

你可以尝试转换

如果我有时间,我将尝试做一个例子。否则...这个C++代码应该被转换为MQL4。

wstring需要被替换成一个ints数组,并在重新计算大小时将其考虑在内。

我是这样想的。

    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:

我有这个。

EMNIP,标准并不保证字符串在连续的内存块中的位置,所以使用&sStringW[0]结构是有问题的。

基本上是同样的鸡蛋。但我的是100%符合标准的:)

 
TheXpert:

EMP,标准不保证字符串在一个连续的内存块中的位置,所以使用&sStringW[0]结构充满了危险。

一般来说,同样的鸡蛋。但我的是100%符合标准的:)

不知道...
 
Zhunko:
我不知道...
好吧,似乎所有(可能是所有)微软的实现都可以做到这一点,我不能为其他的实现担保。
 
TheXpert:
好吧,似乎所有(可能是所有)微软的实现都没有问题,我不能为其他的人担保。
到目前为止,我还没有遇到任何问题。我已经按照标准纠正了我的代码。