DLの書き方は? - ページ 2

 
xrust:

手段を選ばない

このようなものは自由に使えるのでしょうか?
 
それは、私が完成したときになる
 
xrust:
終わったらそうします。
なるほど。了解です)
 

実は、ここを見るのがスタートだとアドバイスされたのですhttp://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx

 
dmmikl86:
私はMQL4で2年間プログラマーです、サイトからチュートリアルを勉強しました。今私はmt4用のDLLを書く方法を学びたいと思います。

良い話題、よくやった同胞

私は自分の経験や知識をmt4プログラマーと共有したいと強く思っています。

 
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);

を追加し、Expert Advisorに追加しました。

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: Machine code」プログラムはコード0(0x0)で停止しました。

ターミナルでこのアドバイザーを実行すると、エラー : 2011.07.08 12:20:14 ExportFunctions EURUSD,H1: cannot call function 'myfunc' from dll 'ExpertSample.dll'(error 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).