Cualquier pregunta de un PROFI a un SUPER PROFI - 1. - página 14

 
Zhunko:

He mirado WinHttpConnect(). No tiene implementación para la codificación multibyte.

¿Puedo utilizar una DLL para el shell y convertirla?


No. No lo necesito en una DLL. Sé que es una opción, pero está mal...

wininet.dll funciona con todas sus funciones, pero Winhttp tiene un error tan tonto...

Si pudieras llamar a GetLastError desde Kernel32, pero mql4 es perjudicial y no permite hacer funciones con nombres idénticos, incluso con diferentes parámetros...


Por cierto, ¿has probado a ejecutar este script en tu máquina? ¿tal vez sea sólo mi problema?

 
sergeev:

Entiendo que es una opción, pero no es lo mismo...

Por ejemplo, todas sus funciones funcionan con wininet.dll, pero en Winhttp hay un estancamiento tan tonto...

Si pudieras llamar a GetLastError desde Kernel32, pero mql4 es perjudicial y no permite hacer funciones con nombres idénticos, incluso con diferentes parámetros...


Por cierto, ¿has probado a ejecutar este script en tu máquina? ¿tal vez sea sólo mi problema?

¿Y si se inserta una dll intermedia entre GetLastError_2 y Kernel32? ¿No funcionaría?
 
sergeev:

Entiendo que es una opción, pero no funciona así...

wininet.dll, por ejemplo, todas sus funciones funcionan, pero Winhttp tiene un paro tan estúpido...

Si pudieras llamar a GetLastError desde Kernel32, pero mql4 es perjudicial y no permite hacer funciones con nombres idénticos, incluso con diferentes parámetros...

GetLastError() debe ser llamado a bajo nivel --> RtlGetLastWin32Error(). Ilnur lo propuso en su momento. Aquí tienes algunos ejemplos de cómo utilizarlo.

WinHttpConnect() no funcionará en MQL4.

 
Zhunko:


Nada funcionará con WinHttpConnect() en MQL4.

¿Por qué? ¿Por el entero sin signo?
 

Podrías intentar convertirte.

Si tengo tiempo, intentaré hacer un ejemplo. Por lo demás... Este código C++ debe ser convertido a 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 debe ser reemplazado por un array de ints y esto debe ser tenido en cuenta al recalcular el tamaño.
 
TheXpert:

Podrías intentar convertirte.

Si tengo tiempo, intentaré hacer un ejemplo. Por lo demás... Este código C++ debe ser convertido a MQL4:

Hay que reemplazar el wstring por un array de ints y tenerlo en cuenta a la hora de recalcular el tamaño.

Lo tengo así:

    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:

Tengo esto:

EMNIP, el estándar no garantiza la ubicación de la cadena en un bloque continuo de memoria, por lo que utilizar la construcción &sStringW[0] es complicado.

Básicamente los mismos huevos. Pero el mío es 100% según la norma :)

 
TheXpert:

EMP, el estándar no garantiza la ubicación de la cadena en un bloque de memoria contiguo, por lo que el uso de la construcción &sStringW[0] está plagado de peligros.

Los mismos huevos en general. Pero el mío es 100% según la norma :)

No sabía...
 
Zhunko:
No sabía...
Bueno, parece que todas (probablemente todas) las implementaciones de Microsoft están bien con esto, no puedo responder por las otras.
 
TheXpert:
Bueno, parece que todas (probablemente todas) las implementaciones de Microsoft están bien con esto, no puedo responder por las otras.
Hasta ahora no he tenido ningún problema. He corregido mi código a la norma.