본문 바로가기
트레이딩/메타트레이더 코딩

MQL5. struct. 구조체, DLL 함수인자에 구조체 전달 방법

by i.got.it 2019. 5. 16.

 

MQL5 구조체 타입선언. 

// MQL5 에서구조체 선언형식. 
struct ST_DATA
{
 double V1; 
 ...  
}; 

// 즉 아래와 같은 형식은 MQL5 에서는 지원안됨. 

typedef struct __st_data
{
 double V1; 
  ... 
}ST_DATA, *PST_DATA; 

 

MQL5 에서 DLL함수 인자로 구조체  전달. 

- 아래 구문에서 DLL 함수인자가 구조체 포인터인 경우 MQL5 에서 import 부분의 처리가 C와 스타일이 다름에 주의.암튼 작용은 C에서 포인터 전달하는것과 동일한 개념은 달성됨. 

void function(ST_DATA st_dapa); // DLL 함수 인자 구조체인 경우.

// MQL5 에서 호출하려면, 

#import "mydll.dll"
void function(ST_DATA st_data); 
#import

ST_DATA my_st_data; 
function(my_st_data); // 일반 C와 동일. 

/////////////////////////////////////////////
 
void function(ST_DATA * pst_dapa); // DLL 함수 인자 구조체포인터 경우.

#import "mydll.dll"
void function(ST_DATA & pst_data);  /// 중요 & 가 사용된다. MQL5 에서는  * 없고 call by reference만 지원.
#import

ST_DATA my_st_data; 
function(my_st_data); // 그냥 구조체를 인자에 넣어주면 됨.C에서의 구조체 포인터 전달한것과 동일효과있음.

 

MQL5  구조체 멤버 string 타입 문제 많음. 

- 일반 기본 자료형, 고정크기 배열등을 멤버로 갖는것은 mql5 나 c++ 측에서 동일하게 선언하면 되며, mql 5의 string 타입은 c++ 에서는 wchar_t * 로 자료형 정의하면될것으로 여겨지나, 실제 string 타입이 멤버로 있는 경우 정상적인 동작 보장안되므로 사용하지 않는게 속편함.


/// MQL 측의 구조체 정의. 

struct ST_DATA
{
   int v1; 
   double v2; 
   ...
   string str_data; /// MQL5 의 string 자료형. 

};

/// C++ 측의 구조체 정의. 

struct ST_DATA
{
   int v1; 
   double v2; 
   ...
   wchar_t * str_data; /// MQL5 의 string 자료형. 

};

// 참고. C++ 에서 wchar_t * 타입을 CString 으로 받으려면 간단히 아래처럼. 
wchar_t * str_data;
CString cst_data(str_data); // CString 타입으로 받음.  

제조사에서 설명하는 구조체 멤버변수에 string 관련 

f a structure contains variables of the string type and/or object of a dynamic array, the compiler assigns an implicit constructor to such a structure. This constructor resets all the structure members of string type and correctly initializes objects of the dynamic array.

from : https://www.mql5.com/en/docs/basis/types/classes

 

MQL5 의 ushort[] 을 구조체 멤버로 하면 DLL 함수인자로 사용가능  

MQL5 의 함수 StringToShortArray 로 string 타입을 ushort[]  배열로 변환한것을 구조체 멤버로 하면 DLL 함수 인자로 구조체 전달가능. 참고. ushort[] 은 wchar_t[] 와 동일함.

 

 

 

 

MQL5 와 DLL 사이의 구조체 allignment  일치 시키기.

MQL5 에서는 구조체 allignment 는 따로 명시 하지 않은 경우 pack(1)  이 적용된다. 즉 1바이트 단위 얼라인이 적용되어있다.  한편, C++ 에서는 특별히 지정하지 않은 경우 컴파일러 설정에 의한것이 얼라인 적용되기 때문에 DLL 측과  MQL5 측의 구조체 정의에서 pack이 일치하도록 설정해야만 한다. 

아래는 구조체가  4바이트 얼라인먼트 적용된 것으로 MQL5 에서 구조체 선언시 아래 처럼 pack(sizeof(int)) 를 부가 해준다. <- 추천하지 않는다. 사유 : 아래 주의 부분 읽어볼것. 

struct ST_DATA pack(4)  // DLL 측 구조체 4바이트 얼라인과 동일하게 한다. 
{
  ...

}; 

MQL5 측의 기본 pack(1) 을 변경없이 DLL 측을 수정해도된다. 아래는 DLL 측의 구조체에 pack1 적용방법. <-이게 가장 문제없이 MQL5 와 정상 구조체 교환가능한 방법임. 

#pragma pack(push,1) 

typedef struct __st_data
{

...

}ST_DATA, *PST_DATA; 

#pragma pack(pop) 

 

 

주의 : MQL 측의 구조체 얼라인먼트 규칙

 

얼라인먼트 4를 적용하면 4바이트 보다 작은 변수인 경우 더미바이트 추가하여 4바이트로 만드는게 통상적인 구조체 얼라인먼트인데, MQL 에서의 구조체 얼라인먼트는 아럐 예처럼 통상적이질 않다. 

 

 

예. 

struct Simple_Structure pack(4)
     {
      char              c; // sizeof(char)=1
      short             s; // sizeof(short)=2
      int               i; // sizeof(int)=4
      double            d; // sizeof(double)=8
     };

 

위와 같이 pack (4) 로 4바이트 얼라인먼트 적용한 경우 메모리 배치는 아래그림 처럼 됨. 1바이트 변수 char 에 할당된 메모리가 4바이트가 아니고 2바이트임. 2바이트 변수 short 의 경우에도 4바이트가 아닌 2바이트임. 얼라인먼트 기준이 해당변수가 잘라지 않도록 하는 기준이 적용되고 있어서 MQL5 내부에서만 사용하는 경우가 아닌 다른 DLL 등으로 함수 인자로 전달해야 하는 경우 DLL측의 패킹기준과 달라 정상적인 멤버값을 확보하지 못하게 된다. 

 

 

 

MQL 에서의 구조체 관련 제조사 제공정보 상세 

 

 

Documentation on MQL5: Language Basics / Data Types / Structures, Classes and Interfaces

//+------------------------------------------------------------------+ //| Union for color(BGR) conversion to ARGB                          | //+------------------------------------------------------------------+ union ARGB

www.mql5.com

 

 

구조체 멤버에 string 있는것은 DLL 로 전달 불가하다는 포럼  글 

 

Problem with Named Pipes

Maybe I am misundestanding something...

www.mql5.com

 

 

 

연관 

 

 

Visual C++. 구조체 얼라인먼트. 디폴트 설정.

구조체 얼라인먼트 설정 코드의 일부 부분적으로 적용 하려는 경우엔 , 아래처럼 #pragma 구문 적용한다. #pragam pack(pusj,얼라인 바이트 사이즈) // 1,2,4,8.16 중 택1. // 이 구간에 선언된 모든 구조체에

igotit.tistory.com

 

 


첫등록 : 2019년 5월 16일

최종수정 : 

 

본 글 단축주소 : https://igotit.tistory.com/2169

 


 

댓글



 

비트코인




암호화폐       외환/나스닥/골드       암호화폐/외환/나스닥/골드 암호화폐/외환/나스닥/골드   암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)     롤오버 이자 없는 스왑프리계좌
( 스왑프리 암호화폐도 거래 가능 )    
MT4, MT5 , cTrader 모두 지원     FTMO 계좌 매매운용. MT4,MT5