Avatar billede neuro Nybegynder
12. december 2001 - 14:22 Der er 21 kommentarer og
2 løsninger

include DLL

Hvordan inkluderer man en DLL i en Consol Applikation, og hvordan initialiserer man, så man kan bruge dens member funktioner.

Håber nogen har svaret :)

På forhånd tak!
Avatar billede wisen Nybegynder
12. december 2001 - 14:25 #1
Du skal bruge \"LoadLibrary\" og \"GetProcAddress\", så vist jeg husker...
Avatar billede wisen Nybegynder
12. december 2001 - 14:26 #2
Et eksempel fra MSDN :

// File:  RUNTIME.C
// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from MYPUTS.DLL.

#include <stdio.h>
#include <windows.h>

typedef VOID (*MYPROC)(LPTSTR);

VOID main(VOID)
{
    HINSTANCE hinstLib;
    MYPROC ProcAdd;
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(\"myputs\");

    // If the handle is valid, try to get the function address.

    if (hinstLib != NULL)
    {
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, \"myPuts\");

        // If the function address is valid, call the function.

        if (fRunTimeLinkSuccess = (ProcAdd != NULL))
            (ProcAdd) (\"message via DLL function\\n\");

        // Free the DLL module.

        fFreeResult = FreeLibrary(hinstLib);
    }

    // If unable to call the DLL function, use an alternative.

    if (! fRunTimeLinkSuccess)
        printf(\"message via alternative method\\n\");
}

/Wisen
Avatar billede borrisholt Novice
12. december 2001 - 14:30 #3
i forlængelse af Wisen svar, vil jeg sige på præcis samme måde som i en GUI applikation.

Jens B
Avatar billede jpk Nybegynder
12. december 2001 - 14:39 #4
Er det en COM dll?

Avatar billede jpk Nybegynder
12. december 2001 - 14:46 #5
I så fald kan du skrive:

#import \"MyDll.dll\" no_namespace named_guids

Så vil indholdet af dit type library blive konverteret til C++ klasser som du kan kalde.
et type library kan være:

a type library (.TLB or .ODL) file
an executable (.EXE) file
a library (.DLL) file containing a type library resource (such as .OCX)
a compound document holding a type library
any other file format that can be understood by the LoadTypeLib API


Avatar billede neuro Nybegynder
12. december 2001 - 14:47 #6
kan man ikke inklude det så man kan initialiserer det som et objekt ligesom når man bruger activeX controls i VB osv. ????
Avatar billede neuro Nybegynder
12. december 2001 - 14:49 #7
hvis jeg bruger:
#import \"MyDll.dll\" no_namespace named_guids

kan man så gøre noget i retning af:
ClassName c;
c.MyMemberFunction();

?????????????
Avatar billede neuro Nybegynder
12. december 2001 - 14:54 #8
altså hvor ClassName er navnet på en class i min dll
Avatar billede jpk Nybegynder
12. december 2001 - 15:07 #9
Har du headerfilen/headerfilerne for dll\'en?

Avatar billede neuro Nybegynder
12. december 2001 - 15:22 #10
min dll er lavet i VB, så nej jeg har ingen header fil .. jeg er HELT på bar bund, og har ikke prøvet at import en dll i c før :)

men kunne være fedt, hvis man på en måde kunne importerer sin dll og initliazerer det som et objekt ligesom
f.eks.

set cn = createobject(\"adodb.connection\")

i visual basic. er der noget tilsvarende i c, eller er der kun den hårde måde?
Avatar billede neuro Nybegynder
12. december 2001 - 15:22 #11
eller skal jeg lave en wrapper class til min dll?
Avatar billede neuro Nybegynder
12. december 2001 - 15:32 #12
det er en activeX dll forresten
Avatar billede neuro Nybegynder
12. december 2001 - 15:47 #13
jeg har prøvet

--> KODE

#include \"stdafx.h\"

#import \"XAPI32DAC.dll\" no_namespace named_guids
typedef VOID (*MYPROC)(LPTSTR);

void main(int argc, char* argv[]) {

    HINSTANCE hinstLib;
    MYPROC ProcAdd;
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

    // Get a handle to the DLL module.
    hinstLib = LoadLibrary(\"XAPI32DAC\");

    // If the handle is valid, try to get the function address.
    if (hinstLib != NULL) {

        printf(\"* Load DLL (OK)\\n\");

        ProcAdd = (MYPROC) GetProcAddress(hinstLib, \"setsql\");

        // If the function address is valid, call the function.
        if (fRunTimeLinkSuccess = (ProcAdd != NULL))
            printf(\"* DLL Member Function Found (OK)\\n\");

        // Free the DLL module.
        fFreeResult = FreeLibrary(hinstLib);
        printf(\"* Free DLL (OK)\\n\");
    }

    // If unable to call the DLL function, use an alternative.
    if (! fRunTimeLinkSuccess)
        printf(\"* ERROR: DLL Member Function NOT Found.\\n\");

};

--> KODE SLUT

men det vil ikke virke .. den kan ikke finde min member funktion..
Avatar billede jpk Nybegynder
12. december 2001 - 15:51 #14
Okay, ActiveX er COM...
Bruger du Visual C++?

Avatar billede jpk Nybegynder
12. december 2001 - 19:03 #15
Hvis du bruger VC++ og du har kompileret kontrollen heri, er den nok allerede registreret. Hvis den ikke er registreret kan du gøre det i en command prompt med kommandoen regsvr32.

Du kan så \"indsætte\" den i dit projekt ved at vælge:

Project->Add To Project->Components and Controls
Der kommer en dialogboks frem, vælg mappen \"Registered ActiveX Controls\".
Du kan så finde din kontrol her og vælge \"Insert\".
Så kommer den frem i din Controls toolbar, så du kan indsætte den direkte på en dialog hvis du vil, eller du kan oprette kontrollen dynamisk!

Avatar billede neuro Nybegynder
12. december 2001 - 23:47 #16
ja jeg bruger vc++, men det er en consol app, så der er ikke nogen dialogs. kan man godt bruge COM i consol apps?
Avatar billede wisen Nybegynder
13. december 2001 - 08:17 #17
Ja, det burde være muligt, jeg har dog ikke prøvet....
Avatar billede jpk Nybegynder
13. december 2001 - 08:20 #18
Her er et eksempel...


      #include <stdio.h>

      // This is the path for your DLL.
      // Make sure that you specify the exact path.

      #import \"c:\\project1.dll\"  no_namespace

      void main()
      {
      BSTR bstrDesc;

      try
      {
      CoInitialize(NULL);
      short st = 2;
      short st1;
      // Declare the Interface Pointer for your Visual Basic object. Here,
      // _Class1Ptr is the Smart pointer wrapper class representing the
      // default interface of the Visual Basic object.

      _Class1Ptr ptr;
      // Create an instance of your Visual Basic object, here
      // __uuidof(Class1) gets the CLSID of your Visual Basic object.

      ptr.CreateInstance(__uuidof(Class1));
      st1 = ptr->MyVBFunction(&st);
      }
      catch(_com_error &e)
      {
      bstrDesc = e.Description();

      }
      CoUninitialize();
      }
Avatar billede neuro Nybegynder
13. december 2001 - 13:53 #19
jpk har prøvet, men _Class1Ptr hvad er det? Jeg har prøvet at erstatte det med class navnet på min class i min dll, men det virker ik =/ så får jeg bare fejlen undefined struct.

Hvad går galt?
Avatar billede neuro Nybegynder
13. december 2001 - 13:53 #20
jeg har også kigget på en anden metode

----- KODE

#import \"XAPI32RND.dll\" no_namespace named_guids

typedef int (CALLBACK* RINTTYPE)();

void main(int argc, char* argv[]) {

    HINSTANCE    hInstDLL        = NULL;
    RINTTYPE    _rint            = NULL;

    hInstDLL=LoadLibrary(\"XAPI32RND.dll\");

    if (hInstDLL!=NULL) {

        printf(\"* XAPI32RND.dll loaded.\\n\");
               
        _rint = (RINTTYPE)GetProcAddress(hInstDLL,\"rint\");

        if (_rint!=NULL) {

            int r=_rint();
            printf(\"Member function found, called and returned: %d\\n\",r);

        } else {
            printf(\"* ERROR: Member function rint() not found!\\n\");
        }

        if (FreeLibrary(hInstDLL)) {
            printf(\"* DLL freed\\n\");
        } else {
            printf(\"* ERROR: Unable to free DLL!\\n\");
        }


    } else {
        printf(\"* ERROR: XAPI32RND.dll not found!\\n\");
    }

};

--- KODE SLUT

men der returnerer GetProcAddress af en eller anden grund NULL, men jeg kan ikke lurer hvorfor?!

Avatar billede jpk Nybegynder
13. december 2001 - 14:03 #21
Okay, du skal selvfølgelig ændre et par småting:

c:\\project1.dll skal erstattes med sti+navn for din dll
_Class1Ptr skal ændres til \"_\" + navnet på din klasse + Ptr, fx _PersonPtr (Måske IPersonPtr hvis det er et interface)
Class1 skal ændres til navnet på din klasse

Avatar billede neuro Nybegynder
13. december 2001 - 14:34 #22
jpk> kanon .. nu virker det :) tusind tak skal du have.
Avatar billede wisen Nybegynder
13. december 2001 - 14:38 #23
Takker for point :)
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