20. juni 2004 - 15:45Der 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
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;
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.
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?
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.
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.
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)?
Er lige kommet tilbage fra festival... Er stadig lidt våd.
Mange tak for linket. Skal nok vise sig nyttigt :-)
Birger
Synes godt om
Ny brugerNybegynder
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.