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

 

예, 문제는 스크립트가 방금 충돌했다는 것입니다. 그 후 오류 코드를 어떻게 볼 수 있습니까? 아니면 다음 시작에서 즉시 읽을 수 있습니까?

원칙적으로 64x 에서 dll을 컴파일하여 문제를 해결했습니다. 사실, 다른 오류가 나타나기 시작했지만 더 이상 중요하지 않습니다. 일반적으로 c/c++에서 라이브러리를 빌드하고 mql5에 연결하는 방법을 이해해야 했습니다. 귀하의 예는 이제 잘 작동합니다.

 
기사가 업데이트됩니까? dll 작업에 변경 사항이 있습니까?
 

Studio 2017이 있는 경우 이전 스튜디오에 대한 이 지침을 보고 있으며 무엇을 어떻게 수행할지 병합하지 않은 경우 먼저 이 문서를 읽는 것이 좋습니다. https://docs.microsoft.com/ru-ru/ cpp/build/walkthrough-create-and-using-a-dynamic-link-library-cpp?view=vs-2017

그런 다음, 위 기사의 예제와 유사한 이미지로 dll을 이미 생성하고 클라이언트 애플리케이션에서 테스트한 경우 2번 지점부터 "그리고 MQL5 프로그램에서 설명된 그리고 다음과 같이 호출했습니다." 즉, mt5에 작성된 대로 mt5에 dll을 선언합니다.

이것이 내가 내 문제를 해결한 방법입니다.

 

매크로 형식의 C++와 MQL 간의 유형 관계 목록을 원합니다.

 #define MQL_STRING wchar_t
 
@Renat Fatkhullin , DLL에서 배열 및 문자열 크기 조정에 대한 예제가 필요합니다. realloc()을 통해 이를 수행하거나 전송된 데이터를 해제하지 않고 단순히 포인터를 새 데이터 배열로 변경하는 것이 가능합니까?
 

다음은 Visual Studio 2012 C++ 코드입니다. cpp 확장자 포함(main.ssr)

 #define MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport) int __stdcall add( int a= 0 , int b= 0 )
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add( int a= 0 , int b= 0 ) //stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{ return ( 18 );пробовал так return 18 ;}

다음 으로 내보낸 함수 목록이 있는 기본 확장자가 def(main.def)인 파일을 만들었습니다 . 코드는 다음과 같습니다.

LIBRARY "dllmt42"
EXPORTS
add

다음으로 컴파일러는 import

 #import "dllmt42.dll"
int _add( int a= 0 , int b= 0 );
#import

컴파일에는 문제가 없지만 어드바이저를 차트에 놓으면 버그가 뜬다

해결되지 않은 가져오기 함수 호출, 'dllmt42.dll'에서 '_add'를 찾습니다. Total Commander는 파일을 끌 때 함수를 컴파일러 자체로 봅니다.

누가 도움을 줄 수 있습니까? 오류 문제를 해결하는 방법, 올바른 기능 내보내기를 저장하고 담당하는 .def 확장자를 가진 파일이 어떻게 있을 수 있습니까?


 
Seric29 :

다음은 Visual Studio 2012 C++ 코드입니다. cpp 확장자 포함(main.ssr)

다음 으로 내보낸 함수 목록이 있는 기본 확장자가 def(main.def)인 파일을 만들었습니다 . 코드는 다음과 같습니다.

다음으로 컴파일러는 import

컴파일에는 문제가 없지만 어드바이저를 차트에 놓으면 버그가 뜬다

해결되지 않은 가져오기 함수 호출, 'dllmt42.dll'에서 '_add'를 찾습니다. Total Commander는 파일을 끌 때 함수를 컴파일러 자체로 봅니다.

누가 도움을 줄 수 있습니까? 오류 문제를 해결하는 방법, 올바른 기능 내보내기를 저장하고 담당하는 .def 확장자를 가진 파일이 어떻게 있을 수 있습니까?


extern "C"는 C++이므로 내보낸 함수의 선언과 구현 모두에 추가해야 합니다. 그렇지 않으면 입력의 서명이 "양성"이고 MT(다른 모든 사람과 마찬가지로)는 이를 볼 수 없습니다.

 
Maxim Kuznetsov :

extern "C"는 C++이므로 내보낸 함수의 선언과 구현 모두에 추가해야 합니다. 그렇지 않으면 입력의 서명이 "양성"이고 MT(다른 모든 사람과 마찬가지로)는 이를 볼 수 없습니다.

글쎄, 나는 이렇게 썼다

 #define MT4_EXPFUNC extern "C" __declspec(dllexport)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)
MT4_EXPFUNC int __cdecl add( int a= 0 , int b= 0 ) //stdcall
{
     return ( 18 );
}

그리고 여전히 동일 - 해결되지 않은 가져오기 함수 호출, 'dllmt42.dll'에서 '_add'를 찾습니다. . 저것들. ++ 없이 순수한 C가 필요합니까?

 
.def 파일은 전혀 필요하지 않습니다. MQL의 #import 섹션에 있는 기능을 복제해야 합니다.
 
Roffild :
.def 파일은 전혀 필요하지 않습니다. MQL의 #import 섹션에 있는 기능을 복제해야 합니다.

글쎄, 네, 그리고 그것이 없으면 나는 그것을 보았고 그것은 저에게 효과가 없었습니다. 글쎄, 거기에서 복제 할 것을 보여주고 이미 올바른 길로 안내합니까?