2013-02-27 41 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