Forex programozás › Fórum › Kérdések az MQL4 programozási nyelvvel kapcsolatban › kernel32.dll
Címkézve: dll, fájl ellenőrzés
-
SzerzőBejegyzés
-
Sziasztok,
Írtam egy saját dll-t. Ez eddig rendben is van.Az EA indulásakor szeretném ellenőrizni, hogy létezik-e a dll. Ehhez ezt használom:
#import "kernel32.dll" int LoadLibraryA(string); int FreeLibrary(int); #inport bool CheckDllExists(string _name) { int h=LoadLibraryA(StringConcatenate(TerminalPath(),"\\experts\\libraries\\",_name)); if(h==0) { h=LoadLibraryA(_name); if(h==0)return(false); FreeLibrary(h); return(true); } FreeLibrary(h); return(true); }
Mikor az x86-os gépemen futtatom, akkor minden rendben van.
Mikor azonban x64-en szeretném futtatni, azt írja ki, hogy nem találja a dll-t.Mi lehet a probléma? Van ötletetek?
Én ezt használom:
#import "kernel32.dll" int _lclose (int); int _lopen (string,int); #import #define HFILE_ERROR -1 bool Debug.IsFileExists (string fileLocation) { int fileHandle = _lopen(fileLocation, 0); if (fileHandle == HFILE_ERROR) { return(false); } else { _lclose(fileHandle); return(true); } }
Nekem a fentiek nem működtek az új MT4-ben, ezért ezt használom:
#import "Kernel32.dll" int GetFileAttributesA(uchar& lpFileName[]); #import int init() { if (!FileExists( CustomIndicator+".ex4")) Alert(Symbol()+", "+comment+": Hiba! "+CustomIndicator+".ex4 nincs meg."); } //----------------------------------------------------------------------------- // function: FileExists() // Description: Check if a file exists //----------------------------------------------------------------------------- bool FileExists(string sIndicatorName) { char szFileName[255]; string sFile=TerminalPath()+"\\MQL4\\Indicators\\"+sIndicatorName; StrCpy(sFile,szFileName,sizeof(szFileName)); if (GetFileAttributesA(szFileName)==-1) { return(False); } return(True); } //----------------------------------------------------------------------------- // function: StrCpy() // Description: Copy string to null terminated char array // (for dll string parameter in mql4.5) //----------------------------------------------------------------------------- int StrCpy(string sSrc, uchar& szDest[], int iMaxSize) { for (i=0; i<MathMin(StringLen(sSrc),iMaxSize-1); i++) { szDest[i]=(uchar)StringGetChar(sSrc,i); } if (iMaxSize>0) szDest[i]=0; return(i); }
Ez ékezetes fájlnevek esetén gondot okozhat, hiszen ez ANSI típust ad vissza. Az új MT4 fordító esetén javaslom a GetFileAttributesW használatát!
Köszi a kiigazítást!
Valóban. Eddig ez nem okozott gondot, de ami késik…
Módosítottam.Sziasztok,
Nekem ez a 2 megoldás jött be az új MT4-el:
1.) Ehhez saját dll-t kell gyártani
C++ rész:MT4_EXPFUNC BOOL __stdcall isFileExists(const wchar_t* fileName) { if (!fileName) return(FALSE); struct _stat buffer; return((_wstat(fileName, &buffer) == 0) ? TRUE : FALSE); }
MT4 rész:
#define LIBRARIES_PATH "\\MQL4\\Libraries\\" #import "example.dll" bool isFileExists(string); #import ... bool checkFile(string filemane) { if(!isFileExists(StringConcatenate(TerminalInfoString(TERMINAL_DATA_PATH), LIBRARIES_PATH, fileName))) return(false); return(true); }
2.) Ehhez nem :-)
#define LIBRARIES_PATH "\\MQL4\\Libraries\\" #import "kernel32.dll" int GetFileAttributesW(string); #import ... bool checkFile(string filemane) { if(!isFileExists(StringConcatenate(TerminalInfoString(TERMINAL_DATA_PATH), LIBRARIES_PATH, fileName))) return(false); return(true); } bool isFileExists(string fileName, bool allowDirectories=false) { int res = GetFileAttributesW(fileName); if (res == -1) return(false); if (res == 0x10 && !allowDirectories) return(false); // Ez mappa return(true); }
Pedig a forrásokat a code tag-ek közé írtam, de nem formázta be :-(
Köszönöm, hogy megosztottad.
Kódformázásra a következő tagekkel nyílik lehetőség (a space-eket ki kell venni a p r e-ből, csak azért írtam be, hogy látszódjon a kód):
<p r e lang="mql"> MQL forráskód </p r e> <p r e> Egyéb forráskód </p r e>
Köszi bejglee!
Ez a megoldás nagyon elegáns (a 2.)! Adoptálom!
Sokkal jobb mint az enyém. -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.