Qualquer pergunta de um PROFI para um SUPER PROFI - 1. - página 14

 
Zhunko:

Vejamos WinHttpConnect(). Não tem implementação para codificação de múltiplos bytes.

Posso usar uma DLL para shell e convertê-la?


Não. Não preciso disso em uma DLL. Sei que é uma opção, mas é errado...

wininet.dll funciona com todas as suas funções, mas Winhttp tem um bug tão bobo...

Se você pudesse chamar GetLastError do Kernel32, mas o mql4 é prejudicial e não permite fazer funções com nomes idênticos, mesmo com parâmetros diferentes...


A propósito, você já tentou executar este roteiro em sua máquina? talvez seja apenas um problema meu?

 
sergeev:

Entendo que é uma opção, mas não é a mesma coisa...

Por exemplo, todas as suas funções funcionam com wininet.dll, mas em Winhttp há uma banca tão idiota...

Se você pudesse chamar GetLastError do Kernel32, mas o mql4 é prejudicial e não permite fazer funções com nomes idênticos, mesmo com parâmetros diferentes...


A propósito, você já tentou executar este roteiro em sua máquina? talvez seja apenas um problema meu?

E se você inserir uma dll intermediária entre GetLastError_2 e Kernel32? Isso não funcionaria?
 
sergeev:

Entendo que é uma opção, mas não funciona dessa forma.

wininet.dll, por exemplo, todas as suas funções funcionam, mas Winhttp tem uma parada tão estúpida...

Se você pudesse chamar GetLastError do Kernel32, mas o mql4 é prejudicial e não permite fazer funções com nomes idênticos, mesmo com parâmetros diferentes...

GetLastError() deve ser chamado de nível baixo --> RtlGetLastWin32Error(). Ilnur o sugeriu em seu tempo. Aqui estão alguns exemplos de como utilizá-lo.

WinHttpConnect() não funcionará em MQL4.

 
Zhunko:


Nada funcionará com WinHttpConnect() em MQL4.

Por quê? Por causa de um número inteiro não assinado?
 

Você poderia tentar a conversão.

Se eu tiver tempo, tentarei fazer um exemplo. Caso contrário... Este código C++ deve ser convertido para 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;
        }
O cordão deve ser substituído por um conjunto de nervuras e isto deve ser levado em conta ao recalcular o tamanho.
 
TheXpert:

Você poderia tentar a conversão.

Se eu tiver tempo, tentarei fazer um exemplo. Caso contrário... Este código C++ deve ser convertido para MQL4:

O cordão precisa ser substituído por um conjunto de nervuras e levar isso em consideração ao recalcular o tamanho.

Tenho-o assim:

    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:

Eu tenho isto:

EMNIP, a norma não garante a localização da corda em um bloco contínuo de memória, portanto, o uso da construção &stringW[0] é muito difícil.

Basicamente, os mesmos ovos. Mas o meu é 100% de acordo com a norma :)

 
TheXpert:

EMP, o padrão não garante a localização das cordas em um bloco de memória contíguo, portanto, o uso da construção &stringW[0] está repleto de perigos.

Os mesmos ovos em geral. Mas o meu é 100% de acordo com a norma :)

Não sabia...
 
Zhunko:
Eu não sabia...
Bem, parece que todas (provavelmente todas) as implementações da Microsoft estão bem com isto, eu não posso garantir as outras.
 
TheXpert:
Bem, parece que todas (provavelmente todas) as implementações da Microsoft estão bem com isto, eu não posso garantir as outras.
Até agora, não tive nenhum problema. Eu corrigi meu código para o padrão.