2013-02-27 92 views
0

我正尝试用VB.Net为MetaTrader4创建一个DLL。大部分的例子都在C++中,但我知道它可以在VB.Net中完成。我知道它比C++更棘手。用VB.Net创建MetaTrader4 DLL

任何人都可以指向正确的方向吗? 有关定义MT4_EXPFUNC的一些信息__declspec(dllexport)

回答

3

我终于弄清楚如何去做。虽然这不是理想的解决方案,但它起作用。我在这里记录“未来世代”。

基本上,我使用一个名为DLLExporter.Exe的程序,它将托管的.Net类方法转换为直接非托管函数。它在:我的VB.Net代码 http://www.codeproject.com/Articles/37675/Simple-Method-of-DLL-Export-without-C-CLI

样品:

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); 
} 

希望这会帮助谁出有谁的尝试同样的事情。为了解决这个问题,我不得不做很多的阅读/研究。

1

您不会从metatrader中找到任何官方示例。他们的支持总是少有帮助。

你提到的api确实是C++,意思是native。你正在寻找写在vb.net的东西。 .net是托管代码,无论您是寻找vb还是c#甚至是f#,您都需要一个将本地api和数据结构转换为管理的转换层。

研究C++/cli。 Cli是一个允许您在同一个程序集中混合使用本地代码和托管代码的框架。

__declspec(dllexport)是一个指令,告诉链接器哪些函数从本地dll导出,以便它们对dll的使用者可见并且可以在代码中调用。当你输出这样的函数时,它仍然是一个本地函数。

我不确定你是否试图实现管理器或服务器API。在管理器的情况下,整个API是在一个类中,由管理器DLL导出的唯一函数提供的指针。在服务器的情况下,您是将dll作为插件写入服务器的理由,理论上,您可以导出插件的每个功能,但输入和输出类型仍然是本地的,在这种情况下,编写转换器或对输出的函数使用pinvoke。这里是一个解释http://www.codeproject.com/Articles/4965/Using-Platform-Invoke

在任何情况下,你仍然需要编写原生C++代码。

+0

感谢信息的一个问题。这很有帮助。但我已经找到了一个答案,如何做到这一点,而不是理想的,但工作。看到我的答案。 cheersd。 – 2013-03-04 02:10:55

0

有一个开源项目,它可以让你几乎完全访问mtmanapi:MetaTrader4.Manager.Wrapper

这是写在C++/CLI,所以它不会使用它从VB.NET

+0

这不仅仅是经理访问MT4服务器的项目吗?我不认为这是MT4客户端。 – 2017-01-07 18:20:09

+0

是的,它只适用于经理访问 – Uriil 2017-01-07 20:13:51