kernel32.dll 2013-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
    #2370 |

    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: 638

    É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: 638

    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: 638

    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.