VB.Net で MetaTrader4 用の DLL を作成しようとしています。ほとんどの例は C++ で書かれていますが、VB.Net で実行できることはわかっています。C++ よりも少しトリッキーであることはわかっています。
誰かが私を正しい方向に向けることができますか? MT4_EXPFUNC __declspec(dllexport) の定義に関する何か
VB.Net で MetaTrader4 用の DLL を作成しようとしています。ほとんどの例は C++ で書かれていますが、VB.Net で実行できることはわかっています。C++ よりも少しトリッキーであることはわかっています。
誰かが私を正しい方向に向けることができますか? MT4_EXPFUNC __declspec(dllexport) の定義に関する何か
私は最終的にそれを行う方法を理解しています。これは理想的なソリューションではありませんが、機能します。ここでは「未来の世代」のために記録しています。
基本的に、マネージ .Net クラス メソッドを直接アンマネージ関数に変換する DLLExporter.Exe というプログラムを使用しています。それ: http://www.codeproject.com/Articles/37675/Simple-Method-of-DLL-Export-without-C-CLI
私のVB.Netコードのサンプル:
Imports System.Runtime.InteropServices
Public Class myFXTrader
<DllExporter.DllExport()>
Public Shared Function storeFXRatesIntoSQL(
<MarshalAsAttribute(UnmanagedType.LPWStr)> pvsBroker As String _
, <MarshalAsAttribute(UnmanagedType.LPWStr)> pvsSymbol As String _
, <MarshalAsAttribute(UnmanagedType.LPWStr)> pvsTimeStamp As String _
, pviAsk As Double _
, pviBid As Double) As <MarshalAsAttribute(UnmanagedType.LPWStr)> String
Dim vsErrorCode As String = ""
'---------------------------------
Try
'... do some work here ...
Catch ex As Exception
End Try
'---------------------------------
Return vsErrorCode
End Function
End Class
上記のコードをコンパイルした後、実行するだけDLLExporter myFXTrader.dll
で魔法のように動作します。結果の .dll ファイルは、MT4 のライブラリ フォルダーにコピーして使用することができます#import
。以下のサンプルExpert Advisor
コードを参照してください。
#import "FXTrader.Exports.dll"
string storeFXRatesIntoSQL(string pvsBroker, string pvsSymbol, string pviTimeStamp, double pviAsk, double pviBid);
#import
int start()
{
Comment( storeFXRatesIntoSQL( AccountCompany(), Symbol(), TimeLocal(), Ask, Bid) );
int err;
err = GetLastError();
if(err>0) { Alert( err ); }
return(0);
}
これが、同じことを試みている人に役立つことを願っています。これを理解するには、かなりの量の読書/調査を行う必要がありました。
あなたはメタトレーダーからの公式の例を見つけることができません。彼らのサポートは常に役に立たない。
あなたが指摘したように、APIは確かにc ++であり、ネイティブを意味します。あなたはvb.netで何かを書きたいと思っています。.Netはマネージコードであり、vb、c#、さらにはf#を探している場合でも、ネイティブAPIとデータ構造をマネージに変換する変換レイヤーが必要になります。
c ++/cliを調べます。Cliは、同じアセンブリにネイティブコードとマネージコードを混在させることができるフレームワークです。
__declspec(dllexport)は、ネイティブdllからエクスポートする関数をリンカーに指示して、それらがdllのコンシューマーに表示され、コードで呼び出すことができるようにする命令です。そのような関数をエクスポートしても、それはまだネイティブ関数です。
マネージャーまたはサーバーAPIを実装しようとしているかどうかはわかりません。マネージャーの場合、API全体がクラス内にあり、そのポインターは、マネージャーdllによってエクスポートされた唯一の関数によって提供されます。サーバーの場合、サーバーへのプラグインとしてdllを書き込んでいるサーバーの場合、理論的には、プラグインのすべての関数をエクスポートできますが、入力タイプと出力タイプはネイティブのままです。この場合、次のようになります。エクスポートした関数でコンバーターを作成したり、pinvokeを使用したりします。これがpinvokeの説明ですhttp://www.codeproject.com/Articles/4965/Using-Platform-Invoke
いずれにせよ、ネイティブのc++コードを作成する必要があります。
mtmanapi へのほぼ完全なアクセスを提供するオープン ソース プロジェクトがあります: MetaTrader4.Manager.Wrapper。
C++/CLI で書かれているので、VB.NET から使っても問題ありません。