Avatar billede balstrup Nybegynder
05. april 2004 - 14:07 Der er 8 kommentarer og
1 løsning

Dynamisk linkning af DLL'er

Hej!

Jeg er ved at lave en applikation hvor det vil være en fordel for mig at kunne lægge en række protokoller i dll'er og linke til dem dynamisk.
Det skal laves sådan at der kan tilføjes nye protokoller blot ved at lægge en dll med den nye protokol i en bestemt mappe.
Jeg er rimelig ny til dll'er og vil gerne vide om der er nogen der har / ved hvor man kan finde et godt eksempel på hvordan en sådan linkning kan foregå?
Jeg har en fungerende applikation med protokoller, men uden dll'er.
Avatar billede balstrup Nybegynder
05. april 2004 - 14:09 #1
Det skal lige siges at jeg arbejder i C++ med MFC til Pocket PC 2002, med Embedded Visual C++ 3.0. Det virker stort set ligesom Visual Studio 6, så man kan overfører det meste derfra!
Avatar billede arne_v Ekspert
05. april 2004 - 19:09 #2
Et super simpelt eksempel:

C:\dll>type a.cpp
static char *a = "I am A";

extern "C" {

__declspec(dllexport) char *whoami()
{
  return a;
}

}

C:\dll>type b.cpp
static char *b = "I am B";

extern "C" {

__declspec(dllexport) char *whoami()
{
  return b;
}

}
C:\dll>type test.cpp
#include <iostream>

using namespace std;

#include <windows.h>

typedef char *(*whoamifunc)();

void test(char *dllname)
{
  HINSTANCE mydll = LoadLibrary(dllname);
  whoamifunc fncptr = (whoamifunc)GetProcAddress(mydll,"whoami");
  cout << fncptr() << endl;
}

int main()
{
  test("a.dll");
  test("b.dll");
  return 0;
}

C:\dll>cl a.cpp /LD
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

a.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:a.dll
/dll
/implib:a.lib
a.obj
  Creating library a.lib and object a.exp

C:\dll>cl b.cpp /LD
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

b.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:b.dll
/dll
/implib:b.lib
b.obj
  Creating library b.lib and object b.exp

C:\dll>cl /GX test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

test.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:test.exe
test.obj

C:\dll>test
I am A
I am B
Avatar billede arne_v Ekspert
05. april 2004 - 19:42 #3
Lidt udvidet:

static char *a = "I am A";

extern "C" {

__declspec(dllexport) char *whoami()
{
  return a;
}

__declspec(dllexport) int op(int x, int y)
{
  return (x*y);
}

}

static char *b = "I am B";

extern "C" {

__declspec(dllexport) char *whoami()
{
  return b;
}

__declspec(dllexport) int op(int x, int y)
{
  return (x/y);
}

}

#include <iostream>

using namespace std;

#include <windows.h>

typedef char *(*whoamifunc)();
typedef int (*opfunc)(int x,int y);

void test(char *dllname)
{
  HINSTANCE mydll = LoadLibrary(dllname);
  whoamifunc fncptr1 = (whoamifunc)GetProcAddress(mydll,"whoami");
  cout << fncptr1() << endl;
  opfunc fncptr2 = (opfunc)GetProcAddress(mydll,"op");
  cout << fncptr2(8,2) << endl;
}

int main()
{
  test("a.dll");
  test("b.dll");
  return 0;
}
Avatar billede balstrup Nybegynder
06. april 2004 - 08:41 #4
Hej Arne!
Det ser jo rimeligt tilforladeligt ud!
Et lille spørgsmål før jeg accepterer svaret!
Som jeg forstår koden skal jeg fra mit program kende dll'erne for at kunne kalde dem! Er det ikke muligt at lave koden på en sådan måde at jeg ikke kender dll'ernes navn ved compiletime, men kan linke dem ved run time????
Avatar billede arne_v Ekspert
06. april 2004 - 08:56 #5
I test.cpp er navnet på DLL'en bare en streng, så DLL'erne bruges hverken ved
compile eller link af programmet (DLL'erne skal selvfølgelig buildes et eller
andet sted).

Jeg har valgt at vise 2 hardcoded strenge. Du kan nøjes med 1 (den DLL implementation
som skal bruges). Eller du kan gøre det konfigurerbart.
Avatar billede balstrup Nybegynder
06. april 2004 - 09:03 #6
Tak skal du have!!
Jeg tror jeg kan tage den herfra!
Avatar billede balstrup Nybegynder
06. april 2004 - 10:42 #7
Lige et lille ekstra spørgsmål!!
Hvordan kalder jeg en funktion i mit hovedprogram fra dll'en?????
Jeg har kigget lidt på dllimport, men kan ikke rigtigt finde ud af den!
Avatar billede arne_v Ekspert
06. april 2004 - 11:35 #8
Jeg ville sende en function pointer med som argument over
til koden i DLL'en og så lade den kalde den.
Avatar billede balstrup Nybegynder
06. april 2004 - 11:50 #9
god ide!
Tak skal du have.
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