Avatar billede martin_andersen Nybegynder
14. maj 2003 - 16:15 Der er 8 kommentarer og
1 løsning

Hjælp til dll kald

Hvordan finder jeg et ud af i hvilket bibliotek jeg kører mit program/dll?

Problemmet er at jeg fra en dll skal kalde en ny dll, som ligger i samme bibliotek. Jeg skal bare sikre mig at jeg angive den korrekte sti til denne dll.

Nedenstående er et eksempel på hvordan jeg gør nu. Dette fungere ikke altid, da en bruger kan ændre windows-currentdir inden jeg kalder denne func.
----------------Kode eks--------------------
VoidT ShowDelphiDialog()
{
HINSTANCE dll;
DLLFunc dllFunc;
                 
dll=LoadLibrary("FdkGui.dll");  <------
if(dll != NULL)
  {
      dllFunc = (DLLFunc)GetProcAddress(dll, "DLLShowForm1");
      if(dllFunc != NULL)                   
      {
        dllFunc();
        if(!FreeLibrary(dll))
        {
            F_Printf(NULL,"Error");
        }
      }
      else
      {
        F_Printf(NULL,"Error");
      }
  }
  else
  {
      F_Printf(NULL,"Error");
  }
}
--------------------------------------------
Avatar billede soreno Praktikant
14. maj 2003 - 16:19 #1
Kan du så ikke bare lave en:
GetCurrentDirectory

?
Avatar billede arne_v Ekspert
14. maj 2003 - 16:20 #2
Det gør du vel på samme måde som så mange andre.

Insisterer på at directory med DLL'en skal være i PATH.

Ellers kører programmet bare ikke.

[du kunne også lade dit installation sprogram smide den
ind i Windows DLL directory, men det er altså noget griseri]
Avatar billede soreno Praktikant
14. maj 2003 - 16:20 #3
Eller måske mener du at brugeren ændrer directory til noget helt 3. ?

Så kan du jo skrive path til dll i registry ?
Avatar billede soreno Praktikant
14. maj 2003 - 16:25 #4
Der er mange der parkerer denne type information i:
HKEY_LOCAL_MACHINE\SOFTWARE\??

eller
HKEY_CURRENT_USER\Software\??
Avatar billede martin_andersen Nybegynder
14. maj 2003 - 16:36 #5
Jo... jeg kunne ligge info i registry, men der lidt besværligt når jeg skal bruge registry i forvejen.

I delphi i der mulighed for at få denne sti ved et kald til:
Path := ExcludeFilename(Application.exename);
Avatar billede soreno Praktikant
14. maj 2003 - 16:47 #6
Hvordan ser din (win)main ud ?

sådan:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

eller sådan:
int main(int argc, char **argv)

Hvis det er den nederste indeholder argv[0] path til exe filen.

Jeg er ikke klar over hvordan man får path ved den øverste.
Avatar billede martin_andersen Nybegynder
14. maj 2003 - 17:01 #7
Ja.... jeg udvikler en plugin til FrameMaker, så jeg har ikke ovenstående main metode(r).

Nedenstående kaldes af framemaker ved opstart:
----------------
VoidT F_ApiCommand(IntT command)
{
    F_ObjHandleT docId;

    /* Get the ID of the active document. */
    docId = F_ApiGetId(0, FV_SessionId, FP_ActiveDoc);
    if(!docId) return; /* Return if there is no active document. */

    switch (command)
    {
        case CloseDoc: /* Close document even if it’s changed. */
              F_ApiClose(docId, FF_CLOSE_MODIFIED);
              break;

        case ListDocIDs:
            ListAllDocIDs();
            break;

        case ShowDialog:
            ShowDelphiDialog();
            break;
    }
}
---------------
Avatar billede soreno Praktikant
14. maj 2003 - 17:10 #8
Så tror jeg du slipper nemmest om problemet ved at læse/skrive til reg, eller smide dll'erne i en directory med path (f.eks. system32).

Jeg ville foretrække registry.
Avatar billede martin_andersen Nybegynder
14. maj 2003 - 17:15 #9
Ok... tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester