Avatar billede mad_man Nybegynder
19. august 2003 - 19:54 Der er 21 kommentarer og
1 løsning

dll i c++

ARGH
det her irritere mig....
hvordan laver man en dll..
bare en man kan kalde der kan lave en cout...
det er ik vigtigt hvad den kan bare der er lidt foklaring..
/madman
Avatar billede arne_v Ekspert
19. august 2003 - 19:55 #1
Hvilken compiler ?

(det er compiler specifikt !)
Avatar billede mad_man Nybegynder
19. august 2003 - 19:55 #2
arr dev c++
Avatar billede mad_man Nybegynder
19. august 2003 - 19:56 #3
men hvis jeg laver en dll.... så kan man kalde den fra alle programerings sprog der udenstøtter dll'er ik ...
Avatar billede arne_v Ekspert
19. august 2003 - 19:57 #4
Jo.

Incl. VB !

:-)
Avatar billede arne_v Ekspert
19. august 2003 - 19:59 #5
dev-cpp - prøv med:

new project
DLL
Avatar billede mad_man Nybegynder
19. august 2003 - 19:59 #6
fint det er fatisk i ibasic jeg skal bruge det... eller en kammerat skal =)
han har nogle problemer med at finde en god dll til at sende over netværk med... altså som send() i c++.. og så kunne jeg også lige prøve lidt dll programering =)
Avatar billede arne_v Ekspert
19. august 2003 - 20:00 #7
Jeg har de manuelle gcc kommandoer til at gøre det med, hvis du ikke
kan få det til at virke.

Men de er lidt langhårede så prøv lige the dev-cpp way først.
Avatar billede mad_man Nybegynder
19. august 2003 - 20:02 #8
ja det er ik noget problem at lave en dll der er tom
har du dev-cpp fordi hvor meget af det der står der i er nødvendigt...
jeg bruger version(4.9.8.0)
Avatar billede arne_v Ekspert
19. august 2003 - 20:02 #9
Jeg testede lige selv dev-cpp.

Det ser vist OK ud.

Den laver selv en export af alle symboler, men det er sikkert også
godt nok til at starte med.
Avatar billede mad_man Nybegynder
19. august 2003 - 20:03 #10
de der switch
hvad skal der gøre godt for
Avatar billede mad_man Nybegynder
19. august 2003 - 20:05 #11
men kan jeg ik noget som:
DllClass::DllClass(SOCKET sock, char *data)
{
    send(sock,data,strlen(data),0);
}
Avatar billede arne_v Ekspert
19. august 2003 - 20:05 #12
Den forudsætter at du vil lave en klasse.

Og ikke nogle C funktioner.

Ellers er det meget simpelt.

Alt det der står DLLIMPORT foran er det der er DLL'ens eksterne
interface.

Du kan sagtens slette i det der er der og lave dit eget.
Avatar billede arne_v Ekspert
19. august 2003 - 20:06 #13
Men hold snitterne fra DllMain.
Avatar billede arne_v Ekspert
19. august 2003 - 20:10 #14
send er ikke en særlig objektorienteret ting, så jeg tror at du helt
skal droppe klasser og bare lave nogle funktioner.
Avatar billede mad_man Nybegynder
19. august 2003 - 20:11 #15
hvordan det ???

en klasse er fx main() ik
Avatar billede arne_v Ekspert
19. august 2003 - 20:11 #16
Jeg har et lille eksempel.

Ganske vist til MS VC++ men du kan nok konvertere:

FileManip.h:

#ifdef FILEMANIP_EXPORTS
#define FILEMANIP_API __declspec(dllexport)
#else
#define FILEMANIP_API __declspec(dllimport)
#endif

extern "C" {
FILEMANIP_API void WINAPI FileManip(const char *oldfilename, const char *newfilename);
}

FileManip.cpp:

#include "stdafx.h"
#include "FileManip.h"

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
                )
{
    switch (ul_reason_for_call)
  {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

#include <stdio.h>
#include <string.h>
FILEMANIP_API void WINAPI FileManip(const char *oldfilename, const char *newfilename)
{
  FILE *fp1,*fp2;
  char line[10240];
  int first;
  fp1 = fopen(oldfilename,"r");
  fp2 = fopen(newfilename, "w");
  first = 1;
  while(!feof(fp1)) {
      fgets(line,sizeof(line),fp1);
      if(first) {
        first = 0;
      } else {
        fputs(line,fp2);
      }
  }
  fclose(fp1);
  fclose(fp2);
  return;
}
Avatar billede arne_v Ekspert
19. august 2003 - 20:12 #17
Kald fra VB:

Declare Sub FileManip Lib "C:\util\FileManip" Alias "_FileManip@8" (ByVal oldfilename As String, ByVal newfilename As String)

Function DoFileManip()
  Call FileManip("C:\z.1", "C:\z.2")
End Function

eksmplet kopierer bare en fil eksklusive den første linie.
Avatar billede mad_man Nybegynder
19. august 2003 - 20:12 #18
skal man egentelig have en .h fil eller er det bare noget der er lavet for at gøre livet lettere for alle
Avatar billede arne_v Ekspert
19. august 2003 - 20:16 #19
Man skal ikke.

Men det her er et af de tilfælde, hvor jeg vil sige at man bør.
Avatar billede mad_man Nybegynder
19. august 2003 - 20:16 #20
hvordan bruger man det så fra c++
er det noget med noget LoadLibrary og DLLIMPORT...
Avatar billede arne_v Ekspert
19. august 2003 - 20:22 #21
Du kan enten bruge LoadLibrary og GetProcAddress
eller du builde den med ind.

Den første metide er lidt bøvlet men er specificeret i Win32 API og
dermed standard.

Den sidste metode må være compiler specifik.
Avatar billede arne_v Ekspert
10. september 2003 - 22:10 #22
Tid at lukke spørgsmålet ?
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