#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)); }
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
OBJ_TEXTで メガバイトの情報をプッシュすることはできません。
最も近い候補は、リソース
注:ポイントは、実際にはさまざまなタイプの変数を詰め込んだ構造体です。ターミナルを閉じる/開く時に保存され、またテンプレートにも保存されます。
注:ポイントは、実際にはさまざまなタイプの変数を詰め込んだ構造体です。ターミナルを閉じる/開く時に保存され、テンプレートにも保存されます。
何度も聞きますが、DLL 32/64の解決策はまだなんですか?
なんかWOW32reg.exeが入ってる(˶‾᷄ -̫ ‾᷅˵) ぐるぐる回って、-h -に反応しない、やみくもに登録してもダメだったんです。
Googleも沈黙しています。microsoft.comでは何も見つからなかったので...かなりイケてますね。
?
何がはっきりしないのか?具体的な課題を出してくれ、でも遠回りになってしまう...?
何度も聞きますが、DLL 32/64の解決策はまだなんですか?
なんかWOW32reg.exeが入ってる(˶‾᷄ -̫ ‾᷅˵) ぐるぐる回って、-h -に反応しない、やみくもに登録してもダメだったんです。
Googleも沈黙、microsoft.comでも何も見つからず...総じて急性期です。
というわけで、あくまでアイデアであって、私自身は試していません。端末のビット深度を検出した後、LoadLibraryを使用してDLLを動的にロードします。
何度も聞きますが、DLL 32/64の解決策はもう見つかっているのでしょうか?
ここで何が問題なのか?
インポートでは、パラメータ(int/long)が異なるだけで、同じ関数を2つ指定します。プログラムでは、32/64ビットに応じて、対応する関数を呼び出します。
何度も聞きますが、DLL 32/64の解決策はもう見つかっているのでしょうか?
コンテキストのおかげで :: すべてがすっきりと解決しました。
インポートでは、パラメータ(int/long)が異なるだけで、同じ関数を2つ指定します。プログラムでは、32/64ビットに応じて、対応する関数を呼び出します。
例:こんな感じ。
を、明示的に :: コンテキストを指定して呼び出すコードで使用します。::MemRead(...)
つまり、関数名を掛け合わせるのではなく、ビットレートの自動検出を行い、正しくインポートされたものを呼び出すようにしているのです。
ずっと気になっているのですが、32/64DLLの解決策はもう見つかっているのでしょうか?
最も簡単な方法は、同じ名前のx32とx64のDLLを、それぞれSysWOW64とSystem32という異なるWindowsシステムディレクトリに置くことです。
しかし、プログラム間のデータ交換は、特に行き当たりばったりで対処すると本当に大変なことになります。
だから、おそらく推論とマイクロソフトは、前世紀の90年代に、ファイル、オブジェクトのストリーム交換から行ったとき - OLEからActiveXに -> COM -> COM + -> .NET 、すなわちプログラム間交換の技術に基づいて、プログラミングとコード実行の新しいシステムを作成しました。
ここで何が問題なのか?
インポートでは、パラメータ(int/long)が異なるだけで、同じ関数を2つ指定します。プログラムでは、32/64のビットサイズに応じて、適切な関数を呼び出します。
32bitの方は全く読み込もうとしないし、もう(dllを)呼び出そうともしないのに、プログラムを実行しようとしない。
DLLの使用を許可 する」のチェックを外すと、[OK]ボタンが全く表示されず、キャンセルされるだけです。 許可して[OK]をクリック - プログラムがクラッシュします。 デッドロックが発生します。
理想は、x64のターミナルでdll32を呼び出せるようにすることです。 理論的には可能であることは確かなのですが、方法が わかりません。
32bitの方は全く読み込もうとしないし、もう(dllを)呼び出さないつもりでも、プログラムを実行しようとしないんです。
dllを許可する」のチェックを外すと、「OK」ボタンが全く表示されず、キャンセルされるだけです。 許可して、「OK」をクリックすると、プログラムがクラッシュします。 デッドロックです。
実は、理想を言えば、x64のターミナルでdll32を呼び出せるようにしたいのです。 理論的には可能なのでしょうが、方法が わかりません。
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
ここで、そのようなライブラリの関数を呼び出します。
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