Avatar billede konrad_ix Nybegynder
20. juni 2004 - 15:45 Der er 8 kommentarer og
1 løsning

Brugerinterface fra DLL

Jeg står overfor en programmeringsopgave af en DLL.

Det specielle ved opgaven er, at jeg skal en ny DLL, der skal overskrive den gamle DLL, og bruges af et eksisterende program.

Der skal indgå noget brugerinterface hvor brugeren bliver promptet for spørgsmål. Problemet er at, al funktionalitet skal ligge nede i DLL'en. Det vil ikke muligt at lave kald andre steder fra. Brugerinterfacet skal trigges af en intern variabel i DLL filen.

Jeg har set mange gode eksempler på hvordan DLL indeholder forskellige slags brugerinterfaces, men der er ikke nogen eksempler hvor al funktionaliteten er indeholdt i selve DLL. (Det er altid noget med kald fra eksterne EXE tiler).

Jeg vil blive glad for al slags hjælp der er til stede

Venlig hilsen

Birger Wilhelmsen
Avatar billede hrc Mester
20. juni 2004 - 19:25 #1
Umiddelbart ikke så svær en nød at løse - men der er sikkert noget i vejen med mit eksempel selvom det virkede de få gange jeg testede det:

Min form:

type
  TfrmMain = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure AskForName; external 'TheDll.dll';
function GetNameGivenEarlier : pchar; external 'TheDll.dll';

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  AskForName;
  Edit1.Text := GetNameGivenEarlier;
end;

Mit DLL:

library TheDLL;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
{
  Da jeg sender resultatet retur som pchar antager jeg, at der ikke behøves
  at inkludere ShareMem. Alternativet er at splitte DLL'ets funktioner op i
  1. Indtast Data
  2. Allokér ram til Data som skal sendes til programmet
  3. Returner pointer til data som kopieres over (tildeling til streng kopierer)
  4. Frigiv ram igen
}

uses
  SysUtils,
  Classes,
  Dialogs;

{$R *.res}

var
  Name : string;

procedure AskForName;
begin
  Name := InputBox('Name','Enter name here:',Name);
end;

function GetNameGivenEarlier : pchar;
begin
  result := pchar(Name);
end;

exports
  AskForName index 0,
  GetNameGivenEarlier index 1;

begin
  Name := '';
end.
Avatar billede konrad_ix Nybegynder
20. juni 2004 - 21:26 #2
Mange tak, hrc for det yderst kvalifecerede svar. Jeg har desværre ikke mulighed for at teste det i aften, da Borland aldrig har sendt mig en mail, der gør at jeg kan åbne men Delphi 7 trial. Jeg regner dog med at have noget software i morgen, der giver mig mulighed for at teste det. Derfor vil jeg vende tilbage, og give dig point dér.

Birger Wilhelmsen
Avatar billede konrad_ix Nybegynder
21. juni 2004 - 13:37 #3
Jeg har studeret dit svar. Og det virker altså som om at du stadig benytter dig af noget ekstern kode (min form). Eller er det kun noget du gør, for at teste funktionaliteten?
Avatar billede tolderlund Nybegynder
21. juni 2004 - 14:33 #4
Lige for at gøre en ting klart for dig Birger:
En DLL kan ikke køre selv, den skal kaldes fra en EXE.
Eller kaldes fra en anden DLL der så igen kaldes fra en EXE.
Man kan så selv bestemme hvor meget kode man vil placere i DLL, men man kommer ikke uden om at at have et kald fra en EXE.
Avatar billede konrad_ix Nybegynder
21. juni 2004 - 14:39 #5
Det er jeg klar over. Men den opgave jeg står overfor, er at et eksisterende program skal have opdateret en DLL. Det betyder at der ikke vil være mulighed for at have noget med exe-filen at gøre. Eksisterende funktioner i DLL filen, skal nu ydermere bruger til at prompte brugeren. Dvs. der skal smide en variabel i en messagebox, og responset fra brugeren skal efterfølgende håndteres. Problemet er, at messageboxen skal 'designes' og kaldes inde fra DLL filen. Jeg var bare lidt usikker på hvorvidt det var det som 'hrc' havde gjort.
Avatar billede hrc Mester
21. juni 2004 - 16:55 #6
Næ, jeg var doven og valgte at bruge den "indbyggede" InputBox. Skal du have noget på en form? Skal den kende sin "kalder" (i forb. med placering på skærm, caption og lignende)?
Avatar billede konrad_ix Nybegynder
21. juni 2004 - 21:47 #7
Jeg ville gerne skrive den fylde projektbeskrivelse (som jeg ser den) men den kommer vist til at fylde lidt meget her.
Avatar billede borrisholt Novice
28. juni 2004 - 10:31 #8
Avatar billede konrad_ix Nybegynder
05. juli 2004 - 15:05 #9
Er lige kommet tilbage fra festival... Er stadig lidt våd.

Mange tak for linket. Skal nok vise sig nyttigt :-)

Birger
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