dll에서 함수 호출 및 결과 반환 - 페이지 6

 
그런 다음 f1-포럼
Mike = Terranin = me :) 그리고 이미 Alpari 포럼에서 에뮬레이터를 제공했습니다. MTS 중 몇 개가 내 에뮬레이터에서 충돌했는지 안다면 MTS에 특별히 관심이 없습니다... :)
 
2 마이크
:)) 그렇게 생각했습니다. 그리고 내 시스템에 대해 갑자기 관심이 생기면 여기를 볼 수 있습니다.
http://forum.alpari-idc.ru/viewtopic.php?t=45555
거기에서 물론 그들은 bodyagu에 불을 붙였습니다 ...
원하시면 에뮬레이터를 도와주셔서 시스템을 설명하겠습니다.
 
좋아, murdoc(at) newmail.ru에서 공유하고 싶다면. 여유가 되면 테스터에서 실행하고 결과를 보고하겠습니다.
 
레나트:
_default_에 의해 DLL에서의 모든 가져오기는 _totally_disabled_입니다. 이것은 보호입니다.
누군가 외부 DLL을 사용하려면 "각 DLL 함수 호출 확인" 버튼을 켜고 거기에서 호출되는 내용을 확인하면 됩니다. 이것은 또한 보호입니다. /history 및 /files 디렉토리에만 액세스하여 모든 내장 파일 작업을 보호합니다.

특정 사람이 자신의 DLL로 전문가를 대중에게 제공하면 사용자는 이 DLL을 신뢰하거나 신뢰하지 않습니다. 그가 신뢰하지 않으면 다운로드하지 않고 신뢰하는 경우 " DLL에서 함수 가져오기 허용" 확인란을 선택해야 합니다. 그렇지 않으면 전문가가 작동하지 않습니다. 호출된 함수의 이름은 또한 그에게 유용한 정보를 알려주지 않습니다. 일부 함수가 수행하는 작업을 알아내기 위해 이 DLL이 디스어셈블되어야 하기 때문에 모든 사람이 할 수 있는 것은 아닙니다. 그리고 이 DLL에서 많은 더러운 트릭을 수행할 수 있지만 MT 터미널은 이를 방지할 수 없습니다. 따라서 "보호"는 매우 조건적이며 이 맥락에서 실제 방어가 아닙니다. 이것이 마이크가 의미하는 바라고 생각합니다.

MT 4 Expert Advisors의 사용자 정의 DLL에서 기능을 호출하는 기능은 MT 3에 있는 API를 대체하는 위치에 있습니다. 따라서 MT 4 터미널을 데이터 피드로 전환하고 주문을 할 수 있습니다. API가 제거된 이유(포럼의 다양한 주제로 판단). 하지만 기회가 남아있어 매우 불편하고 많은 유저들이 이에 대해 이야기하며 ".... 싫증나기만 하면 상관없어."라는 농담에서 상황이 떠올랐다. 그리고 이 스레드는 충분한 증거 이상입니다. 저자는 자신의 질문에 대해 구체적이고 유익한 답변을 받은 적이 없습니다. 나에게 이러한 질문은 관련성이 있으며 이에 대한 답변은 훨씬 더 관련성이 있습니다 :-).
어쩌면 나는 프로그래밍에 익숙하지 않을 수도 있지만 현재 시스템에서 전문가 <-> DLL은 정의에 따라 간단하고 아름다운 솔루션을 가질 수 없습니다. 더 정확하게 말하면 MQL4 언어의 틀 안에는 아름다운 해결책이 있을 수 있지만 MT 4 터미널과 사용자 소프트웨어의 통합 틀 안에서는 가볍게 말해서 말도 안 된다. 다른 더 기능적인 솔루션이 있습니다. 그것들은 찾기만 하면 됩니다 :-). 예를 들어, 이 옵션은 mtapi.dll과 같은 기능을 가진 DLL을 생성하지만 이는 거래 센터 서버와 상호 작용하지 않고 클라이언트 컴퓨터의 터미널과 상호 작용합니다. 이 경우 개발자 회사의 이익이 관찰되며(MT 4 터미널이 없으면 DLL이 작동하지 않음) MQL4 전문가보다 자신의 손으로 더 복잡한 것을 만들 수 있는 사람들은 정상적인 기회를 갖게 됩니다. 그들의 소프트웨어(귀하의 GUI 포함)를 거래 시스템과 통합하십시오. 이 옵션이 이미 고려되고 논의된 경우 링크를 제공하십시오(이와 같은 것을 본 적이 없습니다). 고려되지 않는다면 이 문제에 대한 개발자들의 의견을 알고 싶습니다.

추신: 거래 단말기의 광고/설명에 "클라이언트 API를 사용할 수 있는 기능"이라는 줄이 매우 매력적입니다. 이것이 한때 나를 MetaTrader에 매료시켰고, 터미널의 4번째 버전에서 API의 부족은 나를 매우 실망시켰다. 한편으로는 개발자들이, 다른 한편으로는 API를 사용하고자 하는 사람들이 여전히 타협을 하기를 바랍니다. 현재 상황(전문가로부터 DLL 기능 호출)은 만족스럽지 않습니다.
 
여기에서 문제가 발생했습니다. 물론 속도가 엄청나게 느려지고 시청을 마치지 못했을 수 있습니다 .....

VC++용으로 컴파일된 dll이 있습니다.
기능이 있습니다:

무효 __stdcall process_arr(이중 *입력, 이중 *출력, 정수 크기);

다음은 Expert Advisor의 선언문입니다.
# "some.dll" 가져오기
무효 process_arr(이중 입력[], 이중& 출력[], 정수 크기);

배열은 다음과 같이 선언됩니다.

이중 arr1[100];
이중 arr2[100];

그런 다음 첫 번째 배열을 초기화하고 둘 다 함수에 전달합니다.
프로세스_arr(arr1,arr2,100);

모든 것이 훌륭하게 전달되지만 원래대로 돌아가고 싶지 않습니다.

함수에서 돌아온 후 테스트 값을 표시합니다.
인쇄(arr2[1]);
로그에 항목이 나타납니다.
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
대초원에는 전혀 없고 2 ^ 31이와 무슨 관련이 있습니까 ....
같은 방식으로 배열의 다른 요소에서도 나타 납니다.
디버거에서 함수를 종료하기 전에 out 배열의 값은 원래대로입니다(가격에 근접 - ~1.2).
 
숫자 2147483647은 0에 매우 가깝습니다.
더 정확하게는 2^31-1이고 0과 같아야 합니다.
 
무효 __stdcall process_arr(double *in, double *out, int 크기);

다음은 Expert Advisor의 선언입니다.
# "some.dll" 가져오기
무효 process_arr(이중 입력[], 이중& 출력[], 정수 크기);


그냥 추측(MQL에 익숙하지 않기 때문에): 두 번째 매개변수에 is & 정말로 필요합니까?
무효 process_arr(이중 입력[], 이중 출력[], 정수 크기);
 
Rosh에게 그것은 사실이지만 우리는 이중 유형 에 대해 이야기하고 있으며 숫자의 표현은 "조금" 다르며 2 ^ 31은 0에서 상당히 멀리 떨어져 있습니다.... :(

VicK에게 앰퍼샌드는 요점입니다. 덕분에 실제로 배열의 내용을 변경할 수 있습니다 ...
두 번째 배열 - 반환 값이 있는 배열
 
VicK에게 앰퍼샌드는 요점입니다. 덕분에 실제로 배열의 내용을 변경할 수 있습니다 ...
두 번째 배열 - 반환 값이 있는 배열


이 경우 앰퍼샌드에는 본질이 없으며(직접 시도했습니다), 다른 덕분에 배열의 내용을 변경할 수 있습니다 :-). 샘플 디렉토리에 DLL이 있는 예를 보셨습니까? 모든 것이 잘 작동합니다. 비유로 해보세요.
 
쓰레기가 밝혀지면 double [] 유형의 배열을 처리하는 경우 앰퍼샌드가 전혀 날씨를 나타내지 않는 것 같습니다.
하지만 int[]를 사용하면 모든 것이 무리처럼 작동하므로 여전히 여기에서 버그 냄새가 나기 시작한다는 의심이 듭니다.... :(
개발자의 의견을 듣고 싶습니다.

이 케이스에 소스 코드가 제공된다면 아무도 그들의 머리를 속이지 않을 것입니다. 그러나 그래서 ... 당신이 원한다면 도움을 요청합니다