0

我正在尝试使用 VB.Net 为 MetaTrader4 创建一个 DLL。大多数示例都是用 C++ 编写的,但我知道它可以在 VB.Net 中完成。我知道它比 C++ 有点棘手。

谁能指出我正确的方向?关于定义 MT4_EXPFUNC __declspec(dllexport)

4

3 回答 3

3

我终于弄清楚该怎么做。尽管这不是理想的解决方案,但它确实有效。我在这里为“后代”记录。

基本上,我正在使用一个名为 DLLExporter.Exe 的程序,它将托管的 .Net 类方法转换为直接的非托管函数。它位于: 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

您不会从 metatrader 中找到任何官方示例。他们的支持总是没有那么有用。

您提到的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 回答