Toute question d'un PROFI à un SUPER PROFI - 1. - page 14

 
Zhunko:

J'ai regardé WinHttpConnect(). Il n'a pas d'implémentation pour le codage multi-octet.

Puis-je utiliser une DLL pour le shell et le convertir ?


Non. Je n'en ai pas besoin dans une DLL. Je sais que c'est une option, mais c'est faux...

wininet.dll fonctionne avec toutes ses fonctions, mais Winhttp a un bug si bête...

Si vous pouviez appeler GetLastError depuis Kernel32, mais mql4 est néfaste et ne permet pas de faire des fonctions avec des noms identiques, même avec des paramètres différents...


Au fait, avez-vous essayé d'exécuter ce script sur votre machine ? Peut-être est-ce seulement mon problème ?

 
sergeev:

Je comprends que c'est une option, mais ce n'est pas la même chose...

Par exemple, toutes ses fonctions fonctionnent avec wininet.dll, mais dans Winhttp il y a un décrochage aussi stupide...

Si vous pouviez appeler GetLastError depuis Kernel32, mais mql4 est néfaste et ne permet pas de faire des fonctions avec des noms identiques, même avec des paramètres différents...


Au fait, avez-vous essayé d'exécuter ce script sur votre machine ? Peut-être est-ce seulement mon problème ?

Et si vous insérez une dll intermédiaire entre GetLastError_2 et Kernel32, cela ne fonctionnerait-il pas ?
 
sergeev:

Je comprends que c'est une option, mais ça ne marche pas comme ça...

wininet.dll, par exemple, toutes ses fonctions fonctionnent, mais Winhttp a un arrêt si stupide...

Si vous pouviez appeler GetLastError depuis Kernel32, mais mql4 est néfaste et ne permet pas de faire des fonctions avec des noms identiques, même avec des paramètres différents...

GetLastError() devrait être appelé en bas niveau --> RtlGetLastWin32Error(). Ilnur l'a suggéré en son temps. Voici quelques exemples d'utilisation.

WinHttpConnect() ne fonctionnera pas dans MQL4.

 
Zhunko:


Rien ne fonctionnera avec WinHttpConnect() dans MQL4.

Pourquoi ? À cause de l'entier non signé ?
 

Vous pourriez essayer de vous convertir.

Si j'ai le temps, je vais essayer de faire un exemple. Sinon... Ce code C++ doit être converti en 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 doit être remplacé par un tableau d'ints et cela doit être pris en compte lors du recalcul de la taille.
 
TheXpert:

Vous pourriez essayer de vous convertir.

Si j'ai le temps, je vais essayer de faire un exemple. Sinon... Ce code C++ doit être converti en MQL4 :

Il faut remplacer le wstring par un tableau d'ints et en tenir compte lors du recalcul de la taille.

Je vois ça comme ça :

    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:

J'ai ça :

EMNIP, la norme ne garantit pas l'emplacement de la chaîne dans un bloc de mémoire continu, de sorte que l'utilisation de la construction &sStringW[0] est délicate.

En gros, les mêmes œufs. Mais le mien est 100% conforme à la norme :)

 
TheXpert:

EMP, la norme ne garantit pas l'emplacement de la chaîne dans un bloc de mémoire contigu, de sorte que l'utilisation de la construction &sStringW[0] est pleine de dangers.

Les mêmes œufs en général. Mais le mien est 100% conforme à la norme :)

Je ne savais pas...
 
Zhunko:
Je ne savais pas...
Il semble que toutes (probablement toutes) les implémentations de Microsoft soient compatibles avec cela, je ne peux pas me porter garant pour les autres.
 
TheXpert:
Il semble que toutes (probablement toutes) les implémentations de Microsoft soient compatibles avec cela, je ne peux pas me porter garant pour les autres.
Jusqu'à présent, je n'ai eu aucun problème. J'ai corrigé mon code à la norme.
Raison: