PROFIからSUPER PROFIへの質問-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() を使用しても何も動作しません。

なぜ?Unsigned integer だから
 

変換して みたらどうだろう。

時間があれば、例を作ってみようと思います。そうでなければ...この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 は int の配列に置き換えられ、サイズを再計算する際にこれを考慮する必要があります。
 
TheXpert:

変換して みたらどうだろう。

時間があれば、例を作ってみようと思います。そうでなければ...このC++のコードは、MQL4に変換する必要があります。

wstringをint型の配列に置き換え、サイズを再計算する際にそれを考慮する必要があります。

こんな感じで持っています。

    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:
知らなかったんだ...
まあ、マイクロソフトの実装はすべて(おそらくすべて)OKのようですが、他は保証できません。
 
TheXpert:
まあ、マイクロソフトの実装は全部(たぶん全部)OKのようなので、他は保証できませんが。
今のところ、特に問題はありません。私のコードを標準に修正しました。