DLの書き方は? - ページ 2 1234567 新しいコメント Лекарь Центозависимых 2011.07.07 18:16 #11 xrust: 手段を選ばない このようなものは自由に使えるのでしょうか? Rustamzhan Salidzhanov 2011.07.07 18:28 #12 それは、私が完成したときになる Лекарь Центозависимых 2011.07.07 18:39 #13 xrust: 終わったらそうします。 なるほど。了解です) Михаил 2011.07.07 20:27 #14 実は、ここを見るのがスタートだとアドバイスされたのですhttp://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx Леонид 2011.07.07 21:12 #15 dmmikl86: 私はMQL4で2年間プログラマーです、サイトからチュートリアルを勉強しました。今私はmt4用のDLLを書く方法を学びたいと思います。良い話題、よくやった同胞 私は自分の経験や知識をmt4プログラマーと共有したいと強く思っています。 Rustamzhan Salidzhanov 2011.07.07 21:35 #16 Geronimo: 良い話題、よくやった同胞 そして、タフなプログラマ(サイト管理者同様)には、このようなトピックに関するチュートリアルの枝を始めることをお勧めします。 私たちは皆、あなたのアドバイスが必要なのです。 Михаил 2011.07.07 22:40 #17 xrust: 私たちは皆、あなたのアドバイスを必要としています。 FAQのコーナーに質問を追加して、良い回答があればいいのですが・・・。 Rustamzhan Salidzhanov 2011.07.07 22:53 #18 dmmikl86: は、FAQのコーナーに質問を追加して、良い回答があればいいのですが...。 よし、そうしよう。 Михаил 2011.07.08 11:34 #19 .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) と表示されます。 どこがエラーなのか、どうすれば直るのか、アドバイスをお願いします。 Михаил 2011.07.08 11:42 #20 以下は、デバッグの全テキストです。 "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). 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
手段を選ばない
終わったらそうします。
実は、ここを見るのがスタートだとアドバイスされたのですhttp://msdn.microsoft.com/ru-ru/library/1ez7dh12.aspx
私はMQL4で2年間プログラマーです、サイトからチュートリアルを勉強しました。今私はmt4用のDLLを書く方法を学びたいと思います。
良い話題、よくやった同胞
私は自分の経験や知識をmt4プログラマーと共有したいと強く思っています。
良い話題、よくやった同胞
そして、タフなプログラマ(サイト管理者同様)には、このようなトピックに関するチュートリアルの枝を始めることをお勧めします。
私たちは皆、あなたのアドバイスが必要なのです。
私たちは皆、あなたのアドバイスを必要としています。
FAQのコーナーに質問を追加して、良い回答があればいいのですが・・・。
は、FAQのコーナーに質問を追加して、良い回答があればいいのですが...。
.cppに私の関数を追加して、次のようにやってみました。
.defに関数を追加
.mqhに機能を追加した
を追加し、Expert Advisorに追加しました。
ビジュアルでのデバッグ中に次のように表示されました。「[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) と表示されます。
どこがエラーなのか、どうすれば直るのか、アドバイスをお願いします。
以下は、デバッグの全テキストです。