簡體   English   中英

如何通過引用從MQL4傳遞參數到C ++ DLL

[英]How to pass argument by reference from MQL4 to C++ DLL

我試圖在MQL4中編寫一個簡單的程序,它通過引用將變量傳遞給C ++ DLL函數,並在MQL4中打印更新的變量值。 以下是我的代碼。

DLL功能:

void Test(int* X)
{
    *X = 6;
}

MQL4代碼

#import "Test.dll"
void Test(int&);
#import

void OnStart()
{
  int A;
  Test(A);
  Alert(A);
}

但我沒有從變量A的C ++函數中獲得任何價值。有人可以幫我解決我在這里做錯了什么嗎?

提前致謝

讓我們從DLL端開始:

int TestMoreApproachesAtONCE( int *X,
                              int *Y,
                              int  Z
                              )
{
    *X = 6;                   // 6 assigned to a 4B-memory chunk ref'd by *X
     Y = 6;                   // 6 assigned to a variable  Y
     return( Z );             // Z returned as a value passed from Caller
}

MQL4要求DLL具有:

函數導入DLL到mql4程序必須確保Windows API調用協議。 為了確保這樣的協議,在用C或C ++編寫的程序的源文本中,使用特定於Microsoft(r)編譯器的關鍵字__stdcall 該協議的特點如下:

· 調用者 (在我們的例子中是一個mql4程序)應該“看到”一個被調用的函數的原型(從DLL導入),以便將參數正確地組合到一個堆棧中;

· 調用者 (在我們的例子中是一個mql4程序)以相反的順序將參數從右到左放入堆棧 - 按此順序,導入的函數讀取傳遞給它的參數;

· 參數按值傳遞,除了那些通過引用顯式傳遞的參數(在我們的例子中是字符串)

· 導入的函數通過讀取傳遞給它的參數來獨立清理堆棧。

在描述導入函數的原型時,可以使用默認參數。

如果相應的庫無法加載,或者禁止使用DLL,或者找不到導入的功能 - Expert Advisor會在日志(日志文件)中使用相應的消息“Expert Advisor stopped”停止其操作。 在這種情況下,EA會在重新初始化之前不會運行。 作為重新編譯的結果,或者在打開其屬性表並按下“確定”后,可以重新初始化“EA交易”。

現在演示MQL4方面:

#import    "Test.dll" // -----------------------------------------------

                         void Test( int& );

                         int  TestMoreApproachesAtONCE( int &X,
                                                        int &Y,
                                                        int  Z
                                                        );
#import // "Test.dll" // -----------------------------------------------    

void OnStart()
{
     int A = EMPTY,
         B = EMPTY,
         C = EMPTY;
  // ---------------------------------------------------<PRE>
     Print( " TEST:: inital values are: A = ", A,
                                      " B = ", B,
                                      " C = ", C
                                      );
  // ---------------------------------------------------<TEST>

     C = TestMoreApproachesAtONCE( A, B, 6 );

  // ---------------------------------------------------<POST>
     Print( " TEST::  final values are: A = ", A,
                                      " B = ", B,
                                      " C = ", C
                                      );

}

無論如何,享受MQL4的狂野世界 - 也可以享受點擊和閱讀有關MQL4域中MQL4 / DLL集成和/或信令/消息傳遞問題的其他帖子。 隨意問更多

最后,MQL4文檔說明:

傳遞參數
除非明確指出它們是通過引用傳遞的,否則簡單類型的所有參數都將按值傳遞。 傳遞字符串時,傳遞復制字符串的緩沖區地址; 如果通過引用傳遞字符串,則不復制該字符串的緩沖區的地址將傳遞給從DLL導入的函數。

包含動態數組,字符串,類,其他復雜結構以及枚舉對象的靜態或動態數組的結構不能作為參數傳遞給導入的函數。

將數組傳遞給DLL時,始終傳遞數據緩沖區開頭的地址(與AS_SERIES標志AS_SERIES )。 DLL中的函數對AS_SERIES標志一無所知,傳遞的數組是未定義長度的靜態數組; 應使用附加參數來指定數組大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM