MQL5では、常に悪用される可能性があるのです。 ;) - ページ 5

 
sergeev:

OBJ_TEXTで メガバイトの情報をプッシュすることはできません。

最も近い候補は、リソース

注:ポイントは、実際にはさまざまなタイプの変数を詰め込んだ構造体です。ターミナルを閉じる/開く時に保存され、またテンプレートにも保存されます。

 
DC2008:

注:ポイントは、実際にはさまざまなタイプの変数を詰め込んだ構造体です。ターミナルを閉じる/開く時に保存され、テンプレートにも保存されます。

?
 
sergeev:

何度も聞きますが、DLL 32/64の解決策はまだなんですか?

なんかWOW32reg.exeが入ってる(˶‾᷄ -̫ ‾᷅˵) ぐるぐる回って、-h -に反応しない、やみくもに登録してもダメだったんです。

Googleも沈黙しています。microsoft.comでは何も見つからなかったので...かなりイケてますね。

 
sergeev:
?

何がはっきりしないのか?具体的な課題を出してくれ、でも遠回りになってしまう...?

 
MetaDriver:

何度も聞きますが、DLL 32/64の解決策はまだなんですか?

なんかWOW32reg.exeが入ってる(˶‾᷄ -̫ ‾᷅˵) ぐるぐる回って、-h -に反応しない、やみくもに登録してもダメだったんです。

Googleも沈黙、microsoft.comでも何も見つからず...総じて急性期です。

というわけで、あくまでアイデアであって、私自身は試していません。端末のビット深度を検出した後、LoadLibraryを使用してDLLを動的にロードします。

 
MetaDriver:

何度も聞きますが、DLL 32/64の解決策はもう見つかっているのでしょうか?

ここで何が問題なのか?

インポートでは、パラメータ(int/long)が異なるだけで、同じ関数を2つ指定します。プログラムでは、32/64ビットに応じて、対応する関数を呼び出します。

 
MetaDriver:

何度も聞きますが、DLL 32/64の解決策はもう見つかっているのでしょうか?

風のものから関数を呼び出す コード(ポインターを渡す場合)-が見つかりました。

コンテキストのおかげで :: すべてがすっきりと解決しました。


ユーリッチ

インポートでは、パラメータ(int/long)が異なるだけで、同じ関数を2つ指定します。プログラムでは、32/64ビットに応じて、対応する関数を呼び出します。


例:こんな感じ。

#import "MemMap32.dll"
int MemRead(HANDLE32 hmem, int &v[], int pos, int sz, int &err); // чтение вектора v с указанной позиции pos размером sz
#import "MemMap64.dll"
int MemRead(HANDLE64 hmem, int &v[], int pos, int sz, int &err); // чтение вектора v с указанной позиции pos размером sz
#import

// переопределяем вызовы для контроля битности
int MemRead(HANDLE64 h, int &v[], int pos, int sz, int &error) { if (_IsX64) return(MemMap64::MemRead(h, v, pos, sz, error)); return(MemMap32::MemRead((HANDLE32)h, v, pos, sz, error));  }
を、明示的に :: コンテキストを指定して呼び出すコードで使用します。

::MemRead(...)


つまり、関数名を掛け合わせるのではなく、ビットレートの自動検出を行い、正しくインポートされたものを呼び出すようにしているのです。

 
MetaDriver:

ずっと気になっているのですが、32/64DLLの解決策はもう見つかっているのでしょうか?

最も簡単な方法は、同じ名前のx32とx64のDLLを、それぞれSysWOW64とSystem32という異なるWindowsシステムディレクトリに置くことです。

しかし、プログラム間のデータ交換は、特に行き当たりばったりで対処すると本当に大変なことになります。
だから、おそらく推論とマイクロソフトは、前世紀の90年代に、ファイル、オブジェクトのストリーム交換から行ったとき - OLEからActiveXに -> COM -> COM + -> .NET 、すなわちプログラム間交換の技術に基づいて、プログラミングとコード実行の新しいシステムを作成しました。

 
Yurich:

ここで何が問題なのか?

インポートでは、パラメータ(int/long)が異なるだけで、同じ関数を2つ指定します。プログラムでは、32/64のビットサイズに応じて、適切な関数を呼び出します。

32bitの方は全く読み込もうとしないし、もう(dllを)呼び出そうともしないのに、プログラムを実行しようとしない。

DLLの使用を許可 する」のチェックを外すと、[OK]ボタンが全く表示されず、キャンセルされるだけです。 許可して[OK]をクリック - プログラムがクラッシュします。 デッドロックが発生します。

2013.12.19 17:43:20.657 TestFFTdll      'E:\Programs\MetaQuotes_MT5\MQL5\Libraries\fft32.dll' is not 64-bit version


理想は、x64のターミナルでdll32を呼び出せるようにすることです。 理論的には可能であることは確かなのですが、方法が わかりません。

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе - Документация по MQL5
 
MetaDriver:

32bitの方は全く読み込もうとしないし、もう(dllを)呼び出さないつもりでも、プログラムを実行しようとしないんです。

dllを許可する」のチェックを外すと、「OK」ボタンが全く表示されず、キャンセルされるだけです。 許可して、「OK」をクリックすると、プログラムがクラッシュします。 デッドロックです。


実は、理想を言えば、x64のターミナルでdll32を呼び出せるようにしたいのです。 理論的には可能なのでしょうが、方法が わかりません。

今、確認しました。
2013.12.19 18:49:01.437    do (EURUSD,H1)    TEST
2013.12.19 18:49:01.436    do (EURUSD,H1)    Cannot load 'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll'
2013.12.19 18:48:58.929    do    'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll' is not 64-bit version
ライブラリはロードされませんが、その関数が呼び出されるまではすべて動作します(TEST出力)。

ここで、そのようなライブラリの関数を呼び出します。
2013.12.19 18:51:07.446    do (EURUSD,H1)    unresolved import function call
2013.12.19 18:51:07.446    do (EURUSD,H1)    Cannot call 'fnCrashTest', 'test.dll' is not loaded
2013.12.19 18:51:07.445    do (EURUSD,H1)    Cannot load 'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll'
2013.12.19 18:51:05.107    do    'E:\MT5_REV1\Client\MetaTrader5Terminal\Final\MQL5\Libraries\test.dll' is not 64-bit version