kernel32.dll2013-09-05T16:53:26+00:00

Címkézve: ,

10 bejegyzés megtekintése - 1-10 / 10
  • Szerző
    Bejegyzés
  • bejglee
    Tag
    Bejegyzések száma: 16

    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?

    Radulovic Attila
    Tag
    Bejegyzések száma: 646

    É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);
        }
    }
    bejglee
    Tag
    Bejegyzések száma: 16

    Köszi Radu!!!

    filewalker
    Tag
    Bejegyzések száma: 19

    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);
    }
    Radulovic Attila
    Tag
    Bejegyzések száma: 646

    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!

    filewalker
    Tag
    Bejegyzések száma: 19

    Köszi a kiigazítást!
    Valóban. Eddig ez nem okozott gondot, de ami késik…
    Módosítottam.

    bejglee
    Tag
    Bejegyzések száma: 16

    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);   
    }
    
    bejglee
    Tag
    Bejegyzések száma: 16

    Pedig a forrásokat a code tag-ek közé írtam, de nem formázta be 🙁

    Radulovic Attila
    Tag
    Bejegyzések száma: 646

    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>
    
    filewalker
    Tag
    Bejegyzések száma: 19

    Köszi bejglee!

    Ez a megoldás nagyon elegáns (a 2.)! Adoptálom!
    Sokkal jobb mint az enyém.

10 bejegyzés megtekintése - 1-10 / 10

A hozzászóláshoz jelentkezz be!

Adhatok Neked még több ingyenes tartalmat?

Értesítelek hetente megjelenő új tartalmaimról.

Hozzájárulok, hogy az adatvédelmi nyilatkozat szerint biztonságosan kezeld megadott adataimat, valamint hasznos anyagokat és egyedi ajánlatokat küldj nekem termékeiddel, szolgáltatásaiddal kapcsolatban e-mailben