AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DLL einbinden Delphi7 vs Rad Studio 10.2
Thema durchsuchen
Ansicht
Themen-Optionen

DLL einbinden Delphi7 vs Rad Studio 10.2

Ein Thema von diso · begonnen am 9. Jun 2018 · letzter Beitrag vom 10. Jun 2018
Antwort Antwort
diso

Registriert seit: 21. Sep 2007
6 Beiträge
 
#1

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 02:58
Sorry habe das bin Link geposted.. Sources: http://ngspice.sourceforge.net/ngspi..._src_delphi.7z

oder :
Code:
  ngspice_Init: function(ptrchar: Pointer; ptrstat: Pointer; ptrexit: Pointer;
                ptrdata: Pointer; ptrinitdata: Pointer; ptrnoruns: Pointer; userData: Pointer): integer; cdecl;
  ngspice_Com: function(ms: PChar): Integer; cdecl;
  ngspice_GetVec: function(ms: PChar): pVector_info; cdecl;
  ngspice_SendCirc: function(circarray: pcarray): Integer; cdecl;
  ngspice_GetCurPlot: function(): PChar; cdecl;
  ngspice_GetPlotNames: function(): ppansichararray; cdecl;
  ngspice_GetVecsFromPlot: function(plotname: PChar): ppansichararray; cdecl;
  ngspice_Running: function(): boolean; cdecl;
  ngspice_Init_Sync: function(ptrvsrcval: Pointer; ptrisrcval: Pointer; ptrsync: Pointer; ident: PInteger; userData: Pointer): integer; cdecl;
  ngspice_SetBkpt: function(simtime: double): boolean; cdecl;




// attach ngspice.dll and initialize ngspice
procedure TForm1.Button1Click(Sender: TObject);
var
   init_test: integer;
   ng_ident: integer;

begin
   // load dll
   Hdll := LoadLibrary(PChar(StartIni.ReadString('ngspice.dll', 'Path', '')));
   if (Hdll = 0) then
      // try local directory
      Hdll := LoadLibrary('ngspice.dll');
   if (Hdll <> 0) then
   begin
      @ngspice_Init := GetProcAddress(Hdll, 'ngSpice_Init');
      @ngspice_Com := GetProcAddress(Hdll, 'ngSpice_Command');
      @ngspice_GetVec := GetProcAddress(Hdll, 'ngGet_Vec_Info');
      @ngspice_SendCirc := GetProcAddress(Hdll, 'ngSpice_Circ');
      @ngspice_GetCurPlot := GetProcAddress(Hdll, 'ngSpice_CurPlot');
      @ngspice_GetPlotNames := GetProcAddress(Hdll, 'ngSpice_AllPlots');
      @ngspice_GetVecsFromPlot := GetProcAddress(Hdll, 'ngSpice_AllVecs');
      @ngspice_Running := GetProcAddress(Hdll, 'ngSpice_running');
      @ngspice_Init_Sync := GetProcAddress(Hdll, 'ngSpice_Init_Sync');
      @ngspice_SetBkpt := GetProcAddress(Hdll, 'ngSpice_SetBkpt');
      // call initialization
      // send addresses of callback functions, and address of sending object
      init_test := ngspice_Init(@ng_getchar, @ng_getstat, @ng_exit, @ng_data,
                                @ng_initdata, @ng_thread_runs, self);
//       init_test := ngspice_Init(@ng_getchar, nil, @ng_exit, @ng_data,
//                                @ng_initdata, @ng_thread_runs, self);
      if (init_test = 1) then
      begin
        detach(coquit);
      end;
      ng_ident := 5;
      init_test := ngspice_Init_Sync(@ng_sendvsrc, @ng_sendisrc,
                                     @ng_sync {nil} , @ng_ident, self);
      if (init_test = 1) then
      begin
        detach(coquit);
        is_attached := false;
      end;
      will_detach := False;
      is_attached := True;
   end
   else
   begin
     MessageDlg('ngspice.dll not found', mtError, [mbAbort], 0);
     Form1.Close;
   end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.746 Beiträge
 
Delphi 12 Athens
 
#2

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 03:10
PChar durch PAnsiChar ersetzen!

Was du auch in nahtzu allen Tutorials und Beiträgen bezüglich Unicode-Umstellung nachlesen kannst.



Außerdem greift man NIEMALS auf diese hässlichen globalen Variablen zu,
welche genauso heißen, wie die Form, aus deren Events du das aber machst.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
     Form1.Close;
Wenn, dann Self.Close oder nur Close .

Und die Meldung "ngspice.dll not found" ist irreführend.
"not loaded" wäre passender, oder eben garnicht erst den Fehler verfälschen und den korrekten Fehler ausgeben,
also "ngspice.dll not loaded" + MSDN-Library durchsuchenGetLastError + Delphi-Referenz durchsuchenSysErrorMessage
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Jun 2018 um 03:18 Uhr)
  Mit Zitat antworten Zitat
diso

Registriert seit: 21. Sep 2007
6 Beiträge
 
#3

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 03:21
Das ist eine Beispiel/Test Anwendung für die ngspice dll, der Code stammt nicht von mir. (Auch wenn ich nicht wirklich fit bin hätte ich bestimmt nur Close verwendet )

Danke auch dir himitsu =)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 18:35
Ich las gerade das Du DLL mit einer CDECL Anweisung öffnest, da sollte dann immer der Memory Manager von Delphi an erster Stelle mitkompiliert werden, sonst kann es bei Daten-Übertragung (.exe <-> .dll) zu fehlern kommen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 18:39
Ich las gerade das Du DLL mit einer CDECL Anweisung öffnest, da sollte dann immer der Memory Manager von Delphi an erster Stelle mitkompiliert werden, sonst kann es bei Daten-Übertragung (.exe <-> .dll) zu fehlern kommen.
oops.. Dann muss ich viele Fehler in meinen Anwendung haben denn ich verwende ihn nie.

gruss
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.882 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 19:06
Nur wenn man Delphi-Strings verwendet.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 19:55
Nur wenn man Delphi-Strings verwendet.
Dann habe ich das falsch in Erinnerung, Text im allgemeinen dachte ich ist betroffen, ich nutz meist eh stdcall anstelle CDECL.

@EWeiss: Das war kein Angriff meinerseits, ich wollte damit nur sagen das es bei Übermittlung ohne den Manager zu fehlern kommen kann. Da es sich anscheinend nur um Konvention "String" handelt ist meine Aussage eh belangslos geworden.

Ps: Jetzt ist es mir wieder eingefallen bzw ich sehe es, ja das war so Delphi 6/7 rum als ich enorme Probleme hatte da Text immer fehlte/abgeschnitten war, stimmt total @mkinzler, String war damals auch der Übeltäter, ich habe erst jetzt das Projekt gefunden.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 9. Jun 2018 um 20:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.746 Beiträge
 
Delphi 12 Athens
 
#8

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 20:41
Ich las gerade das Du DLL mit einer CDECL Anweisung öffnest, da sollte dann immer der Memory Manager von Delphi an erster Stelle mitkompiliert werden, sonst kann es bei Daten-Übertragung (.exe <-> .dll) zu fehlern kommen.
Wieso?
Die Aufrufkonvention hat absolut garnichts mit den Speichermanagern zu tun.

Die besagen ob Parameter auf dem Stack landen und/oder in den Registern und in welcher Reihenfolge
und wer den Stack am Ende aufräumt (der Aufrufer oder der Aufgerufene).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 20:52
Die Aufrufkonvention hat absolut garnichts mit den Speichermanagern zu tun.
Dann bastel Dir mal eine .dll mit Funktionen die Input/Output : String haben.
Nutze keinen Speichermanager.
Irgendwann wirst Du feststellen das die Strings fehlerhaft sind.
Bindest Du dann den Speichermanager in .dll und .exe ein, sind alle Strings auf magische Weise repariert. (<- objektive Aussage)
Vielleicht handhabt Delphi das jetzt mittlerweise anders (?), aber zu Delphi 6/7 war es ein arges Problem für mich gewesen!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

AW: DLL einbinden Delphi7 vs Rad Studio 10.2

  Alt 9. Jun 2018, 21:01
Und wo kommt bei dir jetzt die Aufrufkonvention ins Spiel?

Genau das wurde doch gesagt. Den Speichermanager brauchst du nur bei Delphi Strings. Unabhöngig von den Aurufkonventionen. Was die Aufrufkonventionen bewirken, wurde auch erklärt.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie ( 9. Jun 2018 um 21:07 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz