0

VB.Net で MetaTrader4 用の DLL を作成しようとしています。ほとんどの例は C++ で書かれていますが、VB.Net で実行できることはわかっています。C++ よりも少しトリッキーであることはわかっています。

誰かが私を正しい方向に向けることができますか? MT4_EXPFUNC __declspec(dllexport) の定義に関する何か

4

3 に答える 3

3

私は最終的にそれを行う方法を理解しています。これは理想的なソリューションではありませんが、機能します。ここでは「未来の世代」のために記録しています。

基本的に、マネージ .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);
}

これが、同じことを試みている人に役立つことを願っています。これを理解するには、かなりの量の読書/調査を行う必要がありました。

于 2013-03-04T02:21:27.327 に答える
1

あなたはメタトレーダーからの公式の例を見つけることができません。彼らのサポートは常に役に立たない。

あなたが指摘したように、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++コードを作成する必要があります。

于 2013-02-28T20:34:46.677 に答える
0

mtmanapi へのほぼ完全なアクセスを提供するオープン ソース プロジェクトがあります: MetaTrader4.Manager.Wrapper

C++/CLI で書かれているので、VB.NET から使っても問題ありません。

于 2016-10-09T12:00:24.080 に答える