| Autor |
Beitrag |
Darnus
      
Beiträge: 34
|
Verfasst: Mo 18.09.06 23:44
hallo ich wolte da ich mich nicht so gut mit DLL auskenne fragen wie man eine DLL aufruft und sie richtig erstellt:
Beispiel:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| library Project1;
uses SysUtils, inifiles, Classes;
{$R *.res} procedure wini;stdcall; var ini:Tinifile; begin ini:=Tinifile.Create(ExtractFilePath(paramstr(0))+'mapsCP2.cfg'); ini.WriteString('settings','w00',''); ini.WriteString('settings','w01',''); ini.WriteString('settings','w02',''); ini.WriteString('settings','w03',''); ini.WriteString('settings','w04',''); ini.WriteString('settings','w05',''); ini.WriteString('settings','w06',''); ini.WriteString('settings','w07',''); ini.WriteString('settings','w08',''); ini.WriteString('settings','w09',''); ini.WriteString('settings','w10',''); ini.WriteString('settings','w11',''); ini.WriteString('settings','w12',''); ini.WriteString('settings','w13',''); ini.WriteString('settings','w14',''); ini.WriteString('settings','w15',''); ini.WriteString('settings','w16',''); ini.WriteString('settings','w7',''); ini.WriteString('settings','w8',''); ini.free; end; end. |
Die dll sol eine INI datei erstellen / schreiben, jedoch weiss ich nicht ob das so 100% richtig ist und vorallem weiss ich nicht wie ich sie aufrufen sol habe schon tuts gesehen aber ich weiss nicht wie ich es hier umsetzen kann. Danke für die hilfe :-) Moderiert von Christian S.: Topic aus Sonstiges (Delphi) verschoben am Di 19.09.2006 um 01:19
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Di 19.09.06 07:28
Hallo Darnus,
warum testest du es nicht selber?
Es fehlt noch der Export-Teil: Delphi-Quelltext So kannst du es dann aus deinem Hauptprogramm aufrufen:
Delphi-Quelltext 1:
| procedure Mini; stdcall; external 'DLLNAME.dll'; |
Ich bezweifle allerdings, dass die DLL wirklich Sinn macht, da diese schätzungsweise 50kb groß sein wird für etwas, was sich leicht auch im Hauptprogramm erledigen lässt.
Wichtig: Wenn die DLL nicht existiert, kommt eine Fehlermeldung und das Programm bricht während des Ladevorgangs ab. Wie man DLLs dynamisch lädt und vieles weitere interessante zu DLLs, findes du bei ASSARBAD DELPHI.
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Zuletzt bearbeitet von wulfskin am Di 19.09.06 11:24, insgesamt 1-mal bearbeitet
|
|
Darnus 
      
Beiträge: 34
|
Verfasst: Di 19.09.06 10:33
Ich weiss aber es hat andere gründe wozu ich das wissen möchte 
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Di 19.09.06 13:01
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| library Project1;
uses SysUtils, inifiles, Classes;
{$R *.res} procedure wini;stdcall; var ini:Tinifile; i:integer; begin ini:=Tinifile.Create(ExtractFilePath(paramstr(0))+'mapsCP2.cfg'); with ini do begin for i := 1 to 16 do begin if (i < 10) then writestring('settings','w0'+inttostr(i),'') else writestring('settings','w'+inttostr(i),''); end; WriteString('settings','w7',''); WriteString('settings','w8',''); Free; end; end; end. |
Das ginge imho so auch kürzer.
@topic: Hast du das nun schon hin bekommen oder hast du noch Fragen?
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 19.09.06 13:35
Hat schon mal jemand darüber nachgedacht, welchen Wert ParamStr(0) in einer DLL zurückliefert? 
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 19.09.06 16:39
@Luckie: Den ParamString der Exe?
Dann wäre vielleicht GetModule[...kA was...] passend.
@Topic: Wenn die DLL und die Exe im gleichen Verzeichnis sind, sollte es egal sein.
Und nochwas, was Luckie bestimmt freut zu hören: Einstellungen gehören nicht ins Programmverzeichnis, sondern ins Anwendungsdaten-Verzeichnis!
(Ja, ich hab mir deinen Artikel durchgelesen. Wo du Recht hast, hast du Recht. Werd mal versuchen mich dran zu halten. Der Tipp mit den bedingt compilierten Pfaden ist übrigens gut. So, genug OT  )
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 19.09.06 17:48
Martok hat folgendes geschrieben: | | @Luckie: Den ParamString der Exe? |
Ich weiß es nicht. Aber hier scheint jeder erstmal davon ausgegangen zu sein, dass es den Pfad der Exe liefert. Aber warum? Ich glaube es nämlich nicht. Denn dann müsste ParamStr(1) die Aufrufparameter der Exe liefern. Aber woher soll die DLL wissen, mit welchen Paramteren die Exe aufgerufen wurde? Es würde mich nicht wundern, wenn ParamStr(0) einen Leerstring zurückliefert.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 19.09.06 17:58
Da hast du meine Neugier geweckt. Und siehe da: ich hatte Recht (gut geraten...)
Irgendwoher weiß die DLL den ParamString.
Die DLL:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| library TestDLL;
uses SysUtils;
procedure GetParamStr(Buffer:PChar; var Length:Integer); var s:string; i:integer; begin for i:= 0 to ParamCount do s:= s+ParamStr(i)+' '; if Buffer=nil then Length:= System.Length(s) else StrPCopy(Buffer,S); end;
exports GetParamStr; end. |
Das Programm:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure GetParamStr(Buffer:PChar; var Length:Integer); external 'TestDLL.DLL';
procedure TForm1.Button1Click(Sender: TObject); var l:integer; buf:String; begin GetParamStr(nil,l); if l>0 then begin SetLength(buf,l+1); GetParamStr(@buf[1],l); ShowMessage(buf); end; end; |
Und dann mit Start->Parameter ein paar Parameter gesetzt und getestet. Interessant.
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 19.09.06 19:10
Martok hat folgendes geschrieben: | | Und dann mit Start->Parameter ein paar Parameter gesetzt und getestet. Interessant. |
In der Tat, interessant.  Man müsste in der System.pas mal gucken, was ParamStr(0) intern macht, da dürfte sich eine Erklärung finden lassen.
|
|
Darnus 
      
Beiträge: 34
|
Verfasst: So 24.09.06 23:25
THx 
|
|
|