Avatar billede benne_ Nybegynder
23. oktober 2002 - 11:06 Der er 17 kommentarer og
4 løsninger

Guides, DLL

Nogen fede sider til guides om, hvordan man implanterer DLLs i sine C++-programmer?
Synes ikke Google tilbyder det helt store resultat...
Avatar billede arne_v Ekspert
23. oktober 2002 - 12:06 #1
Spørger du om hvordan du laver DLL's eller hvordan du
bruger DLL's ?
Avatar billede benne_ Nybegynder
23. oktober 2002 - 12:16 #2
Bare et eksempel eller guide til, hvordan jeg laver en simpel funktion i en DLL, og bruger den via mit C++program..
Avatar billede arne_v Ekspert
23. oktober 2002 - 12:33 #3
Hvis du bruger Visual C++, så er det pærenemt at lave
en DLL ved at aktivere den wizard der gør det for dig.

For at bruge en vilkårlig DLL skal du bruge LoadLibrary
og GetProcAddress.

Jeg skal lige se om jeg kan finde en god referance.
Avatar billede soreno Praktikant
23. oktober 2002 - 12:39 #4
med mingw kan du gøre sådan:
---------------dll.cpp---------------
#include <windows.h>

extern "C" int getNumber();

int WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  return false;
}

__declspec ( dllexport) int getNumber()
{
  return 12345;
}

---------------main.cpp---------------
#include <windows.h>
#include <stdio.h>

int getNumber();
typedef int (* DLLFunc)();

int main(int argc, char **argv)
{
  for(int i=0;i<10;i++)
  {
    printf("%i\n", getNumber());
  }

  return 0;
}

int getNumber()
{
  HINSTANCE dll;
  DLLFunc dllFunc;
    int number;
   
  dll=LoadLibrary("mindll.dll");
  if(dll != NULL)
  {
      dllFunc = (DLLFunc)GetProcAddress(dll, "getNumber");
      if(dllFunc != NULL)
      {
        number = dllFunc();
        if(!FreeLibrary(dll))
        {
            printf("*error* FreeLibrary\n");
        }
      }
      else
      {
        printf("*error* GetProcAddress\n");
      }
  }
  else
  {
      printf("*error* LoadLibrary\n");
  }
  return number;
}
Avatar billede soreno Praktikant
23. oktober 2002 - 12:42 #6
det skal nok lige nævnes at makefilen ser sådan ud:
---------------makefile---------------
CC=g++

EXEDLL= "mindll.dll"
EXEMAIN= "main.exe"

# targets

all:    dll main

dll:
    $(CC) -c "dll.cpp" -s -mwindows -DBUILDING_DLL=1 -I.
    dllwrap --export-all --output-def "dll.def" --implib "dll.a" "dll.o" -o $(EXEDLL)

main:
    $(CC) -c main.cpp -s
    $(CC) -o $(EXEMAIN) "main.o" -s
Avatar billede benne_ Nybegynder
23. oktober 2002 - 12:46 #7
makefilen..?
Jeg lavede det bare i Borland c++ Builder 5?
Men outputtet så således ud:
*error* LoadLibrary
4202572
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
*error* LoadLibrary
2147348480
Avatar billede soreno Praktikant
23. oktober 2002 - 12:47 #8
er der en dll der hedder "mindll.dll" og eksekverer dit program fra samme dir som der hvor dllfilen er ?
Avatar billede benne_ Nybegynder
23. oktober 2002 - 12:49 #9
Yup... Eksekverer Project2.exe (ikke særligt orginalt, men..) og mindll.dll er der...
Avatar billede benne_ Nybegynder
23. oktober 2002 - 12:50 #10
23-10-2002  12:45            46.080 mindll.dll
23-10-2002  12:45              208 Project1.bpf
23-10-2002  12:45            2.334 Project1.bpr
23-10-2002  12:45              116 Project1.lib
23-10-2002  12:46          393.216 Project1.tds
23-10-2002  12:47              199 Project2.bpf
23-10-2002  12:47            2.364 Project2.bpr
23-10-2002  12:47            6.656 Project2.exe
23-10-2002  12:47            65.536 Project2.tds
23-10-2002  12:45              222 Unit1.cpp
23-10-2002  12:45            8.998 Unit1.obj
23-10-2002  12:47              748 Unit2.cpp
23-10-2002  12:47            11.557 Unit2.obj
              13 File(s)        538.234 bytes

for at være præcis
Avatar billede soreno Praktikant
23. oktober 2002 - 12:52 #11
jeg har en eller anden ide om at bcb ikke angiver det dir som din exefil er placeret i som start dir for Project2.exe
prøv at åbne et konsolvindue (dosvindue) og gå hen til det dir hvor dll og exe filen er og skriv:
Project2.exe

alternativt kan du prøve at kopiere mindll.dll ind i:
windows9x: c:\windows\system
winnt_2k_xp: c:\windows\system32
Avatar billede benne_ Nybegynder
23. oktober 2002 - 12:53 #12
Okai.. jeg kørte eller project2.exe fra samme dir
Avatar billede benne_ Nybegynder
23. oktober 2002 - 12:55 #13
Ved en regsvr32 mindll.dll på dll'en fik jeg:

LoadLibrary("mindll.dll") failed - A dynamic link labrary (DLL) initailzation routine failed.
Avatar billede soreno Praktikant
23. oktober 2002 - 12:56 #14
så kan jeg nok ikke hælpe ret meget mere - jeg har aldrig prøve bcb.
men jeg kan oplyse at "*error* LoadLibrary" fremkommer når disse 2 fejler:
dll=LoadLibrary("mindll.dll");
if(dll != NULL)

altså kan mindll.dll ikke findes.
Avatar billede soreno Praktikant
23. oktober 2002 - 12:56 #15
du behøver ikke at registrere den.
Avatar billede soreno Praktikant
23. oktober 2002 - 12:59 #16
har bcb ikke en eller anden wizard der kan lave en projekt-skabelon for dig ?
Avatar billede benne_ Nybegynder
23. oktober 2002 - 13:01 #17
Jow, men den loader jo ikke DLL'en?
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:21 #18
I BCB skal du først lave din DLL vha. DLL wizarden. (File->New...>DLL) Dernæst kan du lave et import library (Tools->Import library) for DLL'en, som du så bare linker med din alm. BCB program. Så behøver du ikke lave loads osv. - det klarer import library'et for dig.

En simpel DLL uden brug af VCL kunne se sådan her ud:
include <windows.h>
#pragma hdrstop

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
  return 1;
}

double dblValue(double);
double halfValue(double);
extern "C" __declspec(dllexport) double changeValue(double, bool);

double dblValue(double value)
{
  return 2* value;
}

double halfValue(double value)
{
  return value / 2.0;
}

double changeValue(double value, bool UpValue)
{
  return UpValue ? dblValue(value) : halfValue(value);
}

Den tilhørende applikation der anvender DLL'en via import-libraryet, ser sådan her ud:

#include <windows.h>
#include <conio.h>
#include "console_DLL.h"

#pragma link "console_DLL.lib";

//---------------------------------------------------------------------------
int main(int, char*)
{
  double number = 123.5;

  clrscr();
  cputs("DLL tester - console_DLL\r\n");

  cprintf("Value %f DOUBLED by DLL : %f\r\n", number, changeValue(number, true));
  cprintf("Value %f HALVED  by DLL : %f\r\n", number, changeValue(number, false));

  cputs("Done - hit a key ..."); getch();
  return 0;
}
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:22 #19
Header-filen til DLL'en ser sådan her ud, og dannes automatisk i fbm. import-biblioteket:

#ifndef __console_DLL_H__
#define __console_DLL_H__

extern "C" __declspec(dllexport) double changeValue(double, bool);

#endif
Avatar billede d34c0n Praktikant
29. oktober 2002 - 16:59 #20
Avatar billede benne_ Nybegynder
30. oktober 2002 - 08:24 #21
d34c0n: der er da ingen artikler om DLL'er i C++?
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