Avatar billede themepark Nybegynder
19. februar 2006 - 21:37 Der er 32 kommentarer

DLL filer med DOS compiler

Tja, det er et newbie spørgsmål, indrømmet, men jeg kan ikke hitte hoved og hale i DLL filer.

Hvad er en DLL egentlig? Jeg ved godt det står for Dynamic Linked Library, men altså, er det noget Windows specifikt, eller kan de også bruges til DOS? Og kan man overhovedet lave DLL filer med en DOS C compiler som f.eks. DJGPP?
Avatar billede bertelbrander Novice
19. februar 2006 - 23:00 #1
Jeg tror godt du kan lave dll'er med djgpp og på dos, men spørgsmålet er nok om der er nogen grund til at gøre det.

DLL kan være en fordel ved at splitte store programmer op i mindre dele og/eller dele kode mellem flere applikationer så koden kun findes i hukommelsen én gang.
Avatar billede themepark Nybegynder
19. februar 2006 - 23:03 #2
Du ved ikke tilfældigvis hvordan jeg gør så? :)
Avatar billede bertelbrander Novice
19. februar 2006 - 23:07 #3
Jeg ved hvordan man gør med mingw (en anden gcc clon):
http://home20.inet.tele.dk/midgaard/tipwin20060212.html
Måske er det på samme måde med djgpp.

Jeg har ikke brugt djgpp de sidste 7-8 år, og har aldrig lavet dll'er med den.
Avatar billede themepark Nybegynder
19. februar 2006 - 23:16 #4
Ja, men problemet er at den vel laver Windows DLL'er :( Jeg bruger dog også den.
Avatar billede bertelbrander Novice
19. februar 2006 - 23:17 #5
Ideen var mest at du der kunne læse hvordan mingw laver dll'er, måske foregår det på samme måde med djgpp.
Avatar billede themepark Nybegynder
19. februar 2006 - 23:35 #6
Ja, det har jeg også fundet ud af, men problemet er at DJGPP ikke har de fleste af de options, der bruges af MinGW, jeg har brugt eksemplet fra arne_v's artikel.
Avatar billede themepark Nybegynder
20. februar 2006 - 00:40 #7
Og det er så først nu, jeg opdager at du har smidt et link til hvordan jeg gør :p Men jeg kom til at tænke på om jeg mon kan compile til 16 bits Windows i så fald.
Avatar billede bertelbrander Novice
20. februar 2006 - 00:42 #8
Jeg tror ikke djgpp kan lave 16bit.
Digital Mars kan, den kan også lave dll'er, men jeg ved stadig ikke om de vil virke i DOS.
Avatar billede themepark Nybegynder
20. februar 2006 - 00:46 #9
Jeg har sådan set skrottet DOS nu, jeg fandt jo ud af at Java alligevel ikke kan bruges der. Men jeg prøver lige at kigge på Digital Mars så.
Avatar billede themepark Nybegynder
20. februar 2006 - 01:41 #10
Jeg er imponeret, det program skal jeg da helt klart bruge fra nu af! :D Jeg har kigget lidt på de options, der er, og jeg vil lige spørge om hvordan -m[tsmcl] skal forstås, altså det med koden og dataene.
Avatar billede bertelbrander Novice
20. februar 2006 - 01:50 #11
tsmcl er forskellige memory modeller til 16 bit kode.

I 16 bit kode laver processoren adresser på to måder, enten ved offset eller ved segment:offset.
Hvis man kun bruger offset kan man kun adressere 64kbyte, ved at bruge både segment og offset kan man adressere 1Mbyte.
Fordelen ved at nøjes med offset er at det er hurtigere og fylder mindre.
Med smcl vælger man om man vil bruge offset (small) eller segment:offset (large) adressering for hhv. code og data.

Med t (for tiny) bruger man ét 64 kbyte segment til både kode og data, man kan med denne model lave .com programmer (bootloadere er (/var) normalt lavet på denne måde.
Avatar billede themepark Nybegynder
20. februar 2006 - 02:14 #12
Hmm...kan jeg godt bruge tiny når jeg laver DOS DLL'er? Jeg får nemlig nogle fejl med -mtd men ikke med -msd eller -mmd

C:\dm\bin>dmc -mtd -WD C:\Xtra\Menu.c C:\Xtra\Menu.dll
link ct+Menu,C:\Xtra\Menu.dll/noi;
OPTLINK (R) for Win32  Release 7.50B1
Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved

SWS.lib
Warning 2: File Not Found SWS.lib
OPTLINK : Warning 23: No Stack
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __argc
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __argv
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __heapbottom
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __exit
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __stack
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __cinit
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined _aenvseg
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined ___initmbctype
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __datapar
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __cpumode
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __mbctype
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __osmajor
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __environ
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined ___faterr
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __osminor
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __okbigbuf
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __pastdata
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined _free
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined _sbrk
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined _exit
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __dos
C:\dm\bin\..\lib\ct.obj(ct)
Error 42: Symbol Undefined __psp
Avatar billede bertelbrander Novice
20. februar 2006 - 02:19 #13
Compileren (/linkeren) siger at der mangler et sws.lib, jeg har heller ikke dette lib.
Så du kan nok ikke lave dll'er med tiny memory model.
Avatar billede themepark Nybegynder
20. februar 2006 - 02:20 #14
Yep, men jeg formodede at det var et der fulgte med DM :( Nå skidt med det.
Avatar billede bertelbrander Novice
20. februar 2006 - 02:24 #15
Der skal nok være nogen der mener at det ikke giver ret meget mening at lave et dll i tiny mode, al kode og data i både program og dll skal ligge i samme 64 kbyte segment.
Avatar billede themepark Nybegynder
20. februar 2006 - 02:34 #16
Du mener at det er en dårlig ide at det ligger i samme segment eller hvad? For øvrigt gør det ingen forskel da alle 5 modes giver den samme fejl med det lib :(
Avatar billede bertelbrander Novice
20. februar 2006 - 02:45 #17
Jeg mener at hvis du kun har 64 kbyte til alt er der ikke ret meget brug for en dll.

Har du downloadet "DOS 16 libraries" fra Digital Mars?
Du linke med sdx.lib hvor x skal udskiftes med den memory model du bygger til.
Avatar billede themepark Nybegynder
20. februar 2006 - 02:57 #18
Aha, derfor...hvordan linker jeg så? Jeg kan ikke lige finde siden med options længere :(
Avatar billede themepark Nybegynder
20. februar 2006 - 03:15 #19
Hmm, vent lidt, jeg har placeret de lib filer i lib mappen, burde den så ikke automatisk søge efter dem der?
Avatar billede themepark Nybegynder
20. februar 2006 - 03:17 #20
Næh holdt nu lige lidt...W'et må vel betyde Windows, men når jeg skriver -msd, burde den vel vide at det er DOS jeg vil compile i :S
Avatar billede themepark Nybegynder
20. februar 2006 - 03:33 #21
Jeg tror jeg roder lidt rundt i det hele. Jeg kan se at -W bruges til Windows DLL'er, men jeg synes ikke jeg kan se noget sted, at der er en option til DOS DLL'er så det er måske slet ikke muligt at gøre.
Avatar billede themepark Nybegynder
20. februar 2006 - 04:32 #22
Skidt med alt det, jeg fandt ud af at jeg skal bruge -ND for DOS i stedet for -WD. Men nu er problemet så at jeg får følgende fejl:


C:\dm\bin>dmc -mmd -ND C:\Xtra\Menu.c C:\Xtra\Menu.dll
link Menu,C:\Xtra\Menu.dll/noi;
OPTLINK (R) for Win32  Release 7.50B1
Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved

Menu.obj(Menu)
Error 42: Symbol Undefined _sound_note

--- errorlevel 1

sound_note findes i en header i include mappen, samt i et library i lib mappen, og i min .c fil samt i de 2 filer er den defineret som sound_note, altså uden den første underscore.
Avatar billede bertelbrander Novice
20. februar 2006 - 19:56 #23
Prøv at poste source koden (eller send den i en email) så skal jeg prøve at linke
Avatar billede themepark Nybegynder
20. februar 2006 - 23:03 #24
#include <sound.h>
#include <stdio.h>
#include <stdlib.h>
int menu(void);


main()
{
while(1)
{
/*get selection and execute the relevant statement*/
switch(menu())
{
case 1:
{
puts("sound the speaker 1\n");
sound_note(2000, 500);
break;
}
case 2:
{
puts("sound that speaker 2\n");
sound(4000, 500);
break;
}
case 3:
{
puts("You are quitting\n");
exit(0);
break;
}
default:
{
puts("Invalid menu choice\n");
break;
}
}
}
return 0;
}

/*menu function*/
int menu(void)
{
int reply;
/*display menu options*/
puts("Enter 1 for beep 1.\n");
puts("Enter 2 for beep 2.\n");
puts("Enter 3 to quit.\n");
/*scan for user entry*/
scanf("%d", &reply);

return reply;
}

Koden har jeg fundet på en hjemmeside, men jeg har ikke kunnet finde dos.h, så jeg har brugt sound.h i Digital Mars i stedet for og sound_note findes yderligere i snn.lib.
Avatar billede bertelbrander Novice
21. februar 2006 - 01:49 #25
Nå det var ikke så let...
Du skal linke med snn.lib, men det ser ikke ud til det vil køre i 16 bit mode :-(

Men så kan man jo altid lave sine egne sound funktioner:
#include <sound.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int menu(void);

void MySound(unsigned short Freq)
{
  unsigned short Dur = 1193181/Freq;
  unsigned char  Reg;
  unsigned char  DurMsb = Dur >> 8;
  unsigned char  DurLsb = Dur;

  asm {
      in    al, 61h
      mov  Reg,  al
  }
  if((Reg & 0x03) == 0)
  {
      Reg |= 0x03;
      asm {
        mov  al,  Reg
        out  61h, al
        mov  al,  0b6h
        out  43h, al
    }
  }
  asm {
      mov al, DurLsb
      out 42h, al
      mov al, DurMsb
      out 42h, al
  }
}

void MyNoSound()
{
  asm {
      in  al, 61h
      and al, 0fch
      out  61h, al
  }
}

int main()
{
  while(1)
  {
      /*get selection and execute the relevant statement*/
      switch(menu())
      {
      case 1:
      {
        puts("sound the speaker 1\n");
        MySound(2000);
        msleep(2000);
        MyNoSound();
        break;
      }
      case 2:
      {
        puts("sound that speaker 2\n");
        MySound(4000);
        msleep(1000);
        MyNoSound();
        break;
      }
      case 3:
      {
        MyNoSound();
        puts("You are quitting\n");
        exit(0);
        break;
      }
      default:
      {
        puts("Invalid menu choice\n");
        break;
      }
      }
  }
  return 0;
}

/*menu function*/
int menu(void)
{
  int reply;
  /*display menu options*/
  puts("Enter 1 for beep 1.\n");
  puts("Enter 2 for beep 2.\n");
  puts("Enter 3 to quit.\n");
  /*scan for user entry*/
  scanf("%d", &reply);

  return reply;
}
Avatar billede themepark Nybegynder
22. februar 2006 - 12:23 #26
Det er sjovt, du nævner den mulighed, for det har faktisk været mit udgangspunkt.

http://www.eksperten.dk/spm/688804 @ 17/02-2006 13:22:25

Men jeg har faktisk fået gjort det nemmere for mig selv. Jeg fandt ud af at menu eksemplet formentlig har brugt Turbo C, som i hvert fald indeholder en dos.h. Den header fil indeholder alle de kommandoer, jeg skal bruge uanset hvordan jeg ender med at lave programmet. Oven i købet får jeg langt færre fejl, men dog stadigvæk nogle, som du måske kan hjælpe mig med i stedet for.

Her er koden, som den stod på websitet (den første version havde jeg ændret pga. nogle ting der ikke var med i de header filer, jeg brugte dengang):

#include "dos.h"
#include "stdio.h"
#include "stdlib.h"

int menu(void);

main()
{
while(1)
{
/*get selection and execute the relevant statement*/
switch(menu())
{
case 1:
{
puts("sound the speaker 1\n");
sound(2000);
sleep(2);
nosound();
break;
}
case 2:
{
puts("sound that speaker 2\n");
sound(4000);
sleep(2);
nosound();
break;
}
case 3:
{
puts("You are quitting\n");
exit(0);
break;
}
default:
{
puts("Invalid menu choice\n");
break;
}
}
}
return 0;
}

/*menu function*/
int menu(void)
{
int reply;
/*display menu options*/
puts("Enter 1 for beep 1.\n");
puts("Enter 2 for beep 2.\n");
puts("Enter 3 to quit.\n");
/*scan for user entry*/
scanf("%d", &reply);

return reply;
}

Alle 3 header filer samt CS.lib hvor sound funktionen findes, ligger i samme mappe som selve Menu.c filen. Jeg har taget filerne fra Turbo C.

Hvis jeg prøver at compile det med Digital Mars, får jeg følgende fejlmeddelelser:
C:\dm\bin>dmc -msd -ND -IC:\jdk15004\include -IC:\jdk15004\include\win32 C:\C\Me
nu.c
void          __emit__();
                    ^
C:\C\dos.h(169) : Error: '=', ';' or ',' expected
void    interrupt      (* _Cdecl getvect(int interruptno)) ();
                        ^
C:\C\dos.h(180) : Error: ')' expected to close function parameter list with
int      _Cdecl getverify      (void);
                                      ^
C:\C\dos.h(181) : Error: 'getverify' is not in function parameter list
void    _Cdecl harderr (int _Cdecl (*handler)());
                                                ^
C:\C\dos.h(182) : Error: 'harderr' is not in function parameter list
void    _Cdecl hardresume      (int axret);
                                          ^
C:\C\dos.h(183) : Error: 'hardresume' is not in function parameter list
Fatal error: too many errors
--- errorlevel 1

Og hvis jeg i stedet for prøver at compile med MinGW, får jeg følgende fejlmeddelelser:
C:\MinGW\bin>gcc -c -IC:\jdk15004\include -IC:\jdk15004\include\win32 C:\C\Menu.
c -o C:\C\Menu.obj
In file included from C:\C\Menu.c:1:
C:\C\/dos.h:180: error: syntax error before '*' token
C:\C\/dos.h:211: error: syntax error before '*' token
C:\C\/dos.h:211: error: `interrupt' declared as function returning a function
C:\C\/dos.h:252: error: stray '\26' in program
In file included from C:\C\Menu.c:1:
C:\C\/dos.h:252:2: warning: no newline at end of file
In file included from C:\C\Menu.c:2:
C:\C\/stdio.h:189: error: stray '\26' in program
In file included from C:\C\Menu.c:2:
C:\C\/stdio.h:189:2: warning: no newline at end of file
In file included from C:\C\Menu.c:3:
C:\C\/stdlib.h:132: error: stray '\26' in program
In file included from C:\C\Menu.c:3:
C:\C\/stdlib.h:132:2: warning: no newline at end of file
C:\C\Menu.c:58:2: warning: no newline at end of file

newline fejlen kender jeg selvfølgelig godt. Mht. stray '\26' er der, når jeg åbner filerne i Notepad, et tegn, der vises som en firkant, jeg går ud fra at den ikke har nogen betydning, eller hvad?
Avatar billede bertelbrander Novice
22. februar 2006 - 19:34 #27
Det er ret usansynligt at du kan bruge en turbo c++ header fil med andre compilere end turbo c++, det samme gælder .obj-filer og .lib.

Jeg tror at det var lettere at bruge de funktioner som jeg lavede, eller bruge turbo c++, den er gratis.
Avatar billede themepark Nybegynder
22. februar 2006 - 19:39 #28
Tja, men som nævnt i det andet spørgsmål er det jo nemmere at bruge sound funktionen, når den nu er da, desuden vil jeg alligevel prøve at lave det bagefter fra bunden hvis jeg kan få sound til at virke. Jeg gik da ud fra at en header fil, når det nu er i C, kunne bruges i alle compilere, det hele lader da til at blive erklæret i den ene header.

Grunden til at jeg ikke kan bruge Turbo C, er at jeg gerne vil prøve at lave en DLL fil ud af det, og det kan Turbo C mig bekendt ikke.
Avatar billede bertelbrander Novice
22. februar 2006 - 19:42 #29
Nogle header-filer kan bruges af alle (/flere) compilere, men dem der følger med compileren kan næsten aldrig bruges af andre compilere.
Avatar billede themepark Nybegynder
22. februar 2006 - 20:05 #30
Hmm, okay men kan du sige mig hvad problemet er i det her tilfælde med de filer?
Avatar billede bertelbrander Novice
22. februar 2006 - 20:15 #31
Det letteste er at klippe den del ud som du skal bruge (de to prototyper) og glemme resten.
Så kan du finde ud af om du kan linke med biblioteket.
Avatar billede themepark Nybegynder
22. februar 2006 - 20:19 #32
Ja, det har jeg også selv tænkt på at gøre, men det jeg mente er hvad der er galt de forskellige steder, umiddelbart har jeg ikke kendskab nok til C til at kunne se det.
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