"10분 안에 MQL5용 DLL 라이브러리를 작성하고 데이터를 교환하는 방법" 기사에 대한 토론 - 페이지 6

 
GarF1eld :
사용   char 대신 wchar_t

wchar_t 가 이미 전달되었으며 도움이 되지 않습니다. 문제는 mql 자체에 있습니다.

 
_DLLAPI void __stdcall demo( char *stream, char *buf){ buf=stream;}

이 코드는 무엇입니까? 포인터를 복사하는 것은 주소가 포함된 4바이트 메모리를 복사하는 것입니다.

이 경우 수신 문자열에 필요한 버퍼 할당에 대해 미리(MQL5 프로그램에서) 주의하면 memcpy 가 도움이 될 수 있습니다.

 
stringo :

이 코드는 무엇입니까? 포인터를 복사하는 것은 주소가 포함된 4바이트 메모리를 복사하는 것입니다.

이 경우 수신 문자열에 필요한 버퍼 할당에 대해 미리(MQL5 프로그램에서) 주의를 기울이면 memcpy 가 도움이 될 수 있습니다.

예, 여기 포인터가 있습니다. 이 코드는 mql4에서 잘 작동합니다. mql5로의 전환이 아닙니다.

여기 있는 모든 사람들이 조언을 해주지만 적어도 한 사람이 mql5에서 dll 함수로 문자열을 전달하는 방법에 대한 실제로 작동하는 예를 보여 주었습니까?

 
:

...

문제

문제가 무엇입니까? MQL에서 dll로 문자열을 인간적으로 전달하는 방법은 무엇입니까?

1) 메시지 감사합니다. 버그가 수정되었습니다. 업데이트를 기다리십시오.

2) wchar _t에 대해 올바르게 들었습니다. MQL5의 문자열은 유니코드입니다.

3) "시각적 디버그를 확인할 때"는 무엇을 의미합니까?

4) 다음과 같이 올바르게 사용하십시오.

 //--- нужно обеспечить буфер строки для заполнения его в DLL
StringInit (b, 256 );
//--- вызываем DLL функцию
demo( "test" ,b);
//--- печатаем результат
Print (b);

//--- в DLL
_DLLAPI void __stdcall demo(wchar_t *stream, wchar_t *buf)
  {
   //--- проверим указатель
   if (stream==NULL || buf== NULL ) return ;
   //--- максимум 256 символов
   wcsncpy(buf,stream, 256 );
  }
 

저와 같은 프로그래머 지망생을 도와주셔서 감사합니다. :) 귀하의 예는 내 상황에 약간의 명확성을 가져 왔습니다.

기운이 나서 나는 wchar_t에서 좋은 오래된 char 로 문자열을 변환하는 함수를 작성하기로 결정했습니다. 이 기능은 char 유형을 사용하는 프로젝트에서 많은 코드를 가지고 있는 사람들에게 필요할 수 있습니다. 그리고 MQL5는 wchar_t만 전달하므로 dll 코드의 절반을 다시 작성하는 것보다 입력 시 변환하는 것이 더 쉽습니다.

 char * w2char( wchar_t * str){
       unsigned int lenght = wcslen(str)+ 1 ;
       char * ansi = new char [lenght];
      wcstombs(ansi, str, lenght);
       return ansi;
}
 
antonix :

저와 같은 프로그래머 지망생을 도와주셔서 감사합니다. :) 귀하의 예는 내 상황에 약간의 명확성을 가져 왔습니다.

기운이 나서 나는 wchar_t에서 좋은 오래된 char로 문자열을 변환하는 함수를 작성하기로 결정했습니다. 이 기능은 char 유형을 사용하는 프로젝트에서 많은 코드를 가지고 있는 사람들에게 필요할 수 있습니다. 그리고 MQL5는 wchar_t만 전달하므로 dll 코드의 절반을 다시 작성하는 것보다 입력 시 변환하는 것이 더 쉽습니다.

문자열을 char *로 받아들이는 DLL 함수는 물론 char 배열의 첫 번째 요소에 대한 포인터를 사용합니다. 즉, MQL5 프로그램에서 이러한 함수의 가져오기를 설명할 때 Char 배열을 문자열 매개변수로 사용해야 합니다.

이러한 경우를 위해 국가 알파벳의 문자열을 올바르게 변환하는 StringToCharArray 함수를 제공했습니다. wcstombs 함수가 항상 이를 올바르게 수행하는 것은 아닙니다.

 

기사는 흥미롭고 유용합니다.

1) 소스코드가 첨부되어 있다는 점이 멋지다. 헉, 컴파일된 DLL은 어디에 있습니까? Megaproger가 생성하는 데 문제가 없는 것은 분명합니다.

그리고 내가 메가도 아니고 프로거라면?! :)

2) 이 기사는 MS 컴파일러를 사용합니다. 그리고 나는 그와 친구가 아닙니다. :) 나는 BC ++를 가지고 있습니다. 그를 위해 날카롭게 된 소스 코드를 배치 할 수 있습니까?

(IMHO, 아마도 MS와 BC용 소스 코드를 항상 업로드하는 것이 더 나을 것입니다. 이들은 두 개의 선두 회사이지만 소스 코드 작성 스타일이 다릅니다).

 

사용자를 다시 불안하게 하지 않도록 잠재적으로 위험한 코드(DLL)를 업로드하지 않으려고 합니다. 또한 이것은 단지 테스트 케이스일 뿐입니다.

불행히도 볼랜드 C++ 컴파일러가 없습니다. 직접 적용해 보십시오. 코드가 한 페이지 미만입니다.

 

yu-sha :

개발자가 너무 높은 목표를 설정하고 있습니까?

그리고 모든 것이 이미 오래전에 완료되었다면(C, Delphi, ...) 왜 바퀴를 재발명합니까?

절대적으로 동의합니다. 예를 들어 나에게 완전한 행복을 위해서는 잘 생각한 COM 인터페이스로 충분하거나 FXRobot Developer Studio ;-)에 대한 기존 개발 전략의 틀 내에서 최소한 포인터를 전달할 가능성이 있습니다. DLL의 MQL5 콜백 기능. 내가 틀렸을 수도 있지만 지금은 내부용으로만 함수를 내보낼 수 있다는 인상을 받았습니다. 우리는 개발 환경으로서 MT가 Borland Delphi( Embarcadero RAD Studio ), Visual Studio 및 기타 많은 것들에 결코 근접하지 않을 것이라는 사실을 이해해야 하는 것 같습니다. 그리고 그것은 개발자의 재능이 아니라 최신 IDE를 개발하는 데 필요한 막대한 리소스입니다. 언급한 타사 제조업체 및 기타 플랫폼의 막대한 지원에 대해 말하는 것이 아닙니다. 먼저, 완벽한 사용자 인터페이스, 일반 기능 및 MQL을 사용하여 MQL 프로그램이 드라이버 역할을 하는 사용자 프로그램과 서버 간의 브리지를 구현하는 기능을 만들기 위한 개발자의 노력을 보고 싶습니다. 오해하지 마세요. 저는 초보 프로그래머 가 좋아하는 장난감을 빼앗고 싶지는 않지만 완벽한 턴키 솔루션을 원하는 전문 프로그래머와 거래자에게 조금 더 관심을 기울여야 한다고 생각합니다. DIY 생성자.
 

우리는 옳은 일을 하지 말고 유익한 일을 해야 합니다. 수익성이 옳은 것이기 때문입니다. 그리고 이 경우(MT5+MQL5+서비스)는 MetaQuotes에 대한 엄청난 혜택(수십 배 또는 수백 배를 지불할 것입니다)이고 거래자에게는 엄청난 혜택입니다. 당장은 아닙니다.

항상 넓게 보고 적어도 5년은 앞을 내다보는 것이 좋습니다. MetaQuotes가 해냈습니다.