Qualsiasi domanda da un PROFI a un SUPER PROFI - 1. - pagina 14

 
Zhunko:

Ho guardato WinHttpConnect(). Non ha un'implementazione per la codifica multibyte.

Posso usare una DLL per la shell e convertirla?


No. Non ne ho bisogno in una DLL. So che è un'opzione, ma è sbagliato...

wininet.dll funziona con tutte le sue funzioni, ma Winhttp ha un bug così stupido...

Se si potesse chiamare GetLastError da Kernel32, ma mql4 è dannoso e non permette di fare funzioni con nomi identici, anche con parametri diversi...


A proposito, hai provato a eseguire questo script sulla tua macchina? Forse è solo un mio problema?

 
sergeev:

Capisco che è un'opzione, ma non è la stessa cosa...

Per esempio, tutte le sue funzioni funzionano con wininet.dll, ma in Winhttp c'è un tale stupido stallo...

Se si potesse chiamare GetLastError da Kernel32, ma mql4 è dannoso e non permette di fare funzioni con nomi identici, anche con parametri diversi...


A proposito, hai provato a eseguire questo script sulla tua macchina? Forse è solo un mio problema?

E se si inserisce una dll intermedia tra GetLastError_2 e Kernel32, non funzionerebbe?
 
sergeev:

Capisco che è un'opzione, ma non funziona così...

wininet.dll, per esempio, tutte le sue funzioni funzionano, ma Winhttp ha un arresto così stupido...

Se si potesse chiamare GetLastError da Kernel32, ma mql4 è dannoso e non permette di fare funzioni con nomi identici, anche con parametri diversi...

GetLastError() dovrebbe essere chiamato a basso livello --> RtlGetLastWin32Error(). Ilnur l'ha suggerito a suo tempo. Ecco alcuni esempi di come usarlo.

WinHttpConnect() non funziona in MQL4.

 
Zhunko:


Niente funzionerà con WinHttpConnect() in MQL4.

Perché? A causa di Unsigned integer?
 

Potresti provare a convertire.

Se ho tempo, cercherò di fare un esempio. Altrimenti... Questo codice C++ deve essere convertito in 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 dovrebbe essere sostituito con un array di ints e questo dovrebbe essere preso in considerazione quando si ricalcola la dimensione.
 
TheXpert:

Potresti provare a convertire.

Se ho tempo, cercherò di fare un esempio. Altrimenti... Questo codice C++ dovrebbe essere convertito in MQL4:

La wstring deve essere sostituita con un array di ints e tenerne conto quando si ricalcola la dimensione.

Ho capito così:

    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:

Ho questo:

EMNIP, lo standard non garantisce la posizione della stringa in un blocco continuo di memoria, quindi usare il costrutto &sStringW[0] è difficile.

Fondamentalmente le stesse uova. Ma il mio è al 100% secondo lo standard :)

 
TheXpert:

EMP, lo standard non garantisce la posizione della stringa in un blocco di memoria contiguo, quindi usare il costrutto &sStringW[0] è pieno di pericoli.

Stesse uova in generale. Ma il mio è al 100% secondo lo standard :)

Non sapevo...
 
Zhunko:
Non sapevo...
Beh, sembra che tutte (probabilmente tutte) le implementazioni Microsoft siano a posto con questo, non posso garantire per le altre.
 
TheXpert:
Beh, sembra che tutte (probabilmente tutte) le implementazioni di Microsoft siano a posto con questo, non posso garantire per le altre.
Finora non ho avuto alcun problema. Ho corretto il mio codice secondo lo standard.