dll을 작성하는 방법? - 페이지 2

 
xrust :

자금에 관하여 - 모두가 자신의 일을 합니다

이 항목은 무료로 사용할 수 있습니까?
 
마치 내가 끝난 것처럼 될거야
 
xrust :
마치 내가 끝난 것처럼 될거야
확인. 이해했다)
 

일반적으로 http://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx 에서 시작하는 것이 좋습니다.

 
dmmikl86 :
저는 MQL4로 2년 동안 프로그래밍을 해왔으며 사이트의 튜토리얼을 사용하여 공부했습니다. 이제 mt4용 dll 작성을 마스터하고 싶습니다. dll을 작성하는 방법을 배우기 시작하는 위치에 관심이 있습니다. 어디에서 도움을 받을지, 무엇을 읽을지 조언해 주십시오. 우선 dll 연결을 사용하여 간단한 EA를 작성하고 싶습니다. 이 EA는 BUY 및 CELL 버튼 두 개가 있는 창을 생성합니다. 저것들. 원 클릭 거래. 어떤 도움을 주셔서 감사합니다 ...

좋은 주제, 잘 했어

그리고 나는 그런 주제에 대한 교육 분기를 시작하기 위해 멋진 프로그래머(그러나 사이트 관리뿐만 아니라)를 권장합니다.

 
Geronimo :

좋은 주제, 잘했어

그리고 나는 그런 주제에 대한 교육 분기를 시작하기 위해 멋진 프로그래머(그러나 사이트 관리뿐만 아니라)를 권장합니다.

킥킥, 우리 모두가 당신의 조언이 얼마나 필요한지, 글쎄, 우리는 그들 없이는 살 수 없습니다...

 
xrust :

킥킥, 우리 모두가 당신의 조언이 얼마나 필요한지, 글쎄, 우리는 그들 없이는 살 수 없습니다...


FAQ 섹션에 좋은 답변이 포함된 질문을 추가하면 됩니다....
 
dmmikl86 :

FAQ 섹션에 좋은 답변이 포함된 질문을 추가하면 됩니다....
좋아 추가하자
 

내 기능을 .cpp에 추가하려고 시도했고 다음과 같이 했습니다.

 //+------------------------------------------------------------------+
//|                                              Sample DLL for MQL4 |
//|                 Copyright © 2004-2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#define WIN32_LEAN_AND_MEAN   // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#pragma pack(push, 1 )
struct RateInfo
  {
   unsigned int       ctm;
   double             open;
   double             low;
   double             high;
   double             close;
   double             vol;
  };
#pragma pack(pop)
//----
struct MqlStr
  {
   int                len;
   char              * string ;
  };
static int CompareMqlStr( const void *left, const void *right);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  {
//----
   switch (ul_reason_for_call)
     {
       case DLL_PROCESS_ATTACH:
       case DLL_THREAD_ATTACH:
       case DLL_THREAD_DETACH:
       case DLL_PROCESS_DETACH:
         break ;
     }
//----
   return (TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall GetIntValue( const int ipar)
  {
   printf ( "GetIntValue takes %d\n" ,ipar);
   return (ipar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall myfunc( int a, int b)
  {
   int c=a+b;
   return (c);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetDoubleValue( const double dpar)
  {
   printf ( "GetDoubleValue takes %.8lf\n" ,dpar);
   return (dpar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC char * __stdcall GetStringValue( char *spar)
  {
   printf ( "GetDoubleValue takes \"%s\"\n" ,spar);
   return (spar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetArrayItemValue( const double *arr, const int arraysize, const int nitem)
  {
//----
   if (arr== NULL )
     {
       printf ( "GetArrayItemValue: NULL array\n" );
       return ( 0.0 );
     }
   if (arraysize<= 0 )
     {
       printf ( "GetArrayItemValue: wrong arraysize (%d)\n" , arraysize);
       return ( 0.0 );
     }
   if (nitem< 0 || nitem>=arraysize)
     {
       printf ( "GetArrayItemValue: wrong item number (%d)\n" , nitem);
       return ( 0.0 );
     }
//----
   return (arr[nitem]);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC BOOL __stdcall SetArrayItemValue( double *arr, const int arraysize, const int nitem, const double value)
  {
//----
   if (arr== NULL )
     {
       printf ( "GetArrayItemValue: NULL array\n" );
       return (FALSE);
     }
   if (arraysize<= 0 )
     {
       printf ( "GetArrayItemValue: wrong arraysize (%d)\n" , arraysize);
       return (FALSE);
     }
   if (nitem< 0 || nitem>=arraysize)
     {
       printf ( "GetArrayItemValue: wrong item number (%d)\n" , nitem);
       return (FALSE);
     }
//----
   arr[nitem]=value;
   return (TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetRatesItemValue( const RateInfo* rates, const int rates_total, const int shift, const int nrate)
  {
//----
   if (rates== NULL )
     {
       printf ( "GetRatesItemValue: NULL array\n" );
       return ( 0.0 );
     }
//----
   if (rates_total< 0 )
     {
       printf ( "GetRatesItemValue: wrong rates_total number (%d)\n" , rates_total);
       return ( 0.0 );
     }
//----
   if (shift< 0 || shift>=rates_total)
     {
       printf ( "GetRatesItemValue: wrong shift number (%d)\n" , shift);
       return ( 0.0 );
     }
//----
   if (nrate< 0 || nrate> 5 )
     {
       printf ( "GetRatesItemValue: wrong rate index (%d)\n" , nrate);
       return ( 0.0 );
     }
//----
   int nitem=rates_total- 1 -shift;
   switch (nrate)
     {
       case 0 : return double (rates[nitem].ctm);
       case 1 : return rates[nitem].open;
       case 2 : return rates[nitem].low;
       case 3 : return rates[nitem].high;
       case 4 : return rates[nitem].close;
       case 5 : return rates[nitem].vol;
     }
//----
   return ( 0.0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall SortStringArray(MqlStr *arr, const int arraysize)
  {
//----
   if (arr== NULL )
     {
       printf ( "SortStringArray: NULL array\n" );
       return (- 1 );
     }
   if (arraysize<= 0 )
     {
       printf ( "SortStringArray: wrong arraysize (%d)\n" , arraysize);
       return (- 1 );
     }
//----
   qsort(arr,arraysize, sizeof (MqlStr),CompareMqlStr);
//----
   return (arraysize);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall ProcessStringArray(MqlStr *arr, const int arraysize)
  {
   int    len1,len2;
//----
   if (arr== NULL )
     {
       printf ( "ProcessStringArray: NULL array\n" );
       return (- 1 );
     }
   if (arraysize<= 0 )
     {
       printf ( "ProcessStringArray: wrong arraysize (%d)\n" , arraysize);
       return (- 1 );
     }
//----
   for ( int i= 0 ; i<arraysize- 1 ; i++)
     {
       if (arr[i]. string == NULL ) len1= 0 ;
       else len1=strlen(arr[i]. string );
       if (arr[i+ 1 ]. string == NULL ) len2= 0 ;
       else len2=strlen(arr[i+ 1 ]. string );
       //---- uninitialized string
       if (arr[i+ 1 ]. string == NULL ) continue ;
       //---- destination string is uninitialized and cannot be allocated within dll
       if (arr[i]. string == NULL )   continue ;
       //---- memory piece is less than needed and cannot be reallocated within dll
       if (arr[i].len<len1+len2)   continue ;
       //---- final processing
      strcat(arr[i]. string ,arr[i+ 1 ]. string );
     }
//----
   return (arraysize);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CompareMqlStr( const void *left, const void *right)
  {
   MqlStr *leftstr=(MqlStr *)left;
   MqlStr *rightstr=(MqlStr *)right;
//----
   if (leftstr-> string == NULL ) return (- 1 );
   if (rightstr-> string == NULL ) return ( 1 );
//----
   return (strcmp(leftstr-> string ,rightstr-> string ));
  }
//+------------------------------------------------------------------+

.def에 기능 추가

LIBRARY ExpertSample

EXPORTS GetIntValue
                myfunc
        GetDoubleValue
        GetStringValue
        GetArrayItemValue
        SetArrayItemValue
        GetRatesItemValue
        SortStringArray
        ProcessStringArray

.mqh에 기능 추가

 #import "ExpertSample.dll"
int     GetIntValue( int );
int     myfunc( int , int );
double GetDoubleValue( double );
string GetStringValue( string );
double GetArrayItemValue( double arr[], int , int );
bool    SetArrayItemValue( double & arr[], int , int , double );
double GetRatesItemValue( double rates[][ 6 ], int , int , int );
int     SortStringArray( string & arr[], int );
int     ProcessStringArray( string & arr[], int );

그런 다음 전문가에 추가

 int init()
  {
   
   double ret,some_value= 10.5 ;
   string sret;
   int     cnt,c;
   string strarray[ 6 ]={ "first" , "second" , "third" , "fourth" , "fifth" };
//---- simple dll-functions call
   cnt=GetIntValue(some_value);
   Print ( "Returned value is " ,cnt);
   ret=GetDoubleValue(some_value);
   Print ( "Returned value is " ,ret);
   sret=GetStringValue( "some string" );
   Print ( "Returned value is " ,sret);
//----
   cnt=SortStringArray(strarray, ArraySize (strarray));
   for ( int i= 0 ; i<cnt; i++) Print (i, " - " ,strarray[i]);
   cnt=ProcessStringArray(strarray, ArraySize (strarray));
   for (i= 0 ; i<cnt; i++) Print (i, " - " ,strarray[i]);
//----
   int a= 5 ;
   int b= 6 ;
   c=myfunc(a,b);
   Comment ( "!!!=" +c);
   return ( 0 );
  }

시각적 개체에서 디버깅하는 동안 프로그램 "[5248] regsvr32.exe: 네이티브 코드"가 코드 0(0x0)과 함께 종료되었습니다.

터미널에서 어드바이저를 시작할 때 오류가 발생했습니다. 2011.07.08 12:20:14 ExportFunctions EURUSD, H1: dll 'ExpertSample.dll'에서 'myfunc' 함수를 호출할 수 없습니다( 오류 127 ).

오류가 어디에 있는지 말해줘? 그리고 그것들을 고치는 방법...

 

다음은 디버그의 전체 텍스트입니다.

 "regsvr32.exe" : Загружено "C:\WINDOWS\system32\regsvr32.exe"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\ntdll.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\kernel32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\msvcrt.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\advapi32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\rpcrt4.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\secur32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\user32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\gdi32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\ole32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\imm32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\MSCTF.dll"
"regsvr32.exe" : Загружено "C:\Program Files\NVIDIA Corporation\nView\nView.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\comctl32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\oleaut32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\psapi.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\shell32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\shlwapi.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\winmm.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\version.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\ntmarta.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\samlib.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\wldap32.dll"
"regsvr32.exe" : Загружено: "C:\Program Files\NVIDIA Corporation\nView\NVWRSRU.dll" , Двоичный код не был построен с отладочной информацией.
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\MSCTFIME.IME"
"regsvr32.exe" : Загружено "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
"regsvr32.exe" : Выгружено: "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
"regsvr32.exe" : Загружено "C:\WINDOWS\system32\nvwddi.dll"
"regsvr32.exe" : Загружено "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
"regsvr32.exe" : Выгружено: "C:\Program Files\NVIDIA Corporation\nView\nvwimg.dll"
Программа "[4944] regsvr32.exe: Машинный код" завершилась с кодом 1 ( 0x1 ).