AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim einbinden einer DLL

Ein Thema von ryLIX · begonnen am 16. Mai 2010 · letzter Beitrag vom 20. Mai 2010
Antwort Antwort
Seite 1 von 2  1 2      
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Probleme beim einbinden einer DLL

  Alt 16. Mai 2010, 23:57
Hi,
ich habe folgendes Problem.
Ich habe eine DLL eingebunden, der Code sieht so aus:
Delphi-Quellcode:
type TAPIRESULTFORMAT = (APIFORMAT_CHAR,
                           APIFORMAT_BYTE,
                           APIFORMAT_INTEGER,
                           APIFORMAT_WORD,
                           APIFORMAT_LONG,
                           APIFORMAT_DWORD,
                           APIFORMAT_TEXT,
                           APIFORMAT_BINARY,
                           APIFORMAT_REAL);

  function __apiEnd(): Boolean; stdcall; external 'api32.dll';
  function __apiInit(): Boolean; stdcall; external 'api32.dll';
  procedure __apiJob(ecu, job, para, result: PChar); stdcall; external 'api32.dll';
  function __apiResultBinary(buffer:Byte; bufferlen:Cardinal; buffersize:Cardinal; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultByte(buffer:Byte;result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultChar(buffer:PChar; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultDWord(buffer:Cardinal; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultFormat(para:TAPIRESULTFORMAT; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultInt(buffer:SmallInt; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultLong(buffer:LongInt; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultName(buffer:PChar; index:Word; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultNumber(buffer:Word; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultReal(buffer:Double; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
  function __apiResultSets(rsets:Word): Boolean; stdcall external 'api32.dll';
  function __apiResultText(buffer:PChar; result:PChar; rset:Word; format:PChar): Boolean; stdcall; external 'api32.dll';
  function __apiResultVar(variable:PChar): Boolean; stdcall; external 'api32.dll';
  function __apiResultWord(buffer:Word; result:PChar; rset:Word): Boolean; stdcall; external 'api32.dll';
Nun hab ich das Problem wenn ich das Programm starte bleibt es sofort im CPU Fenster hängen und wenn ich weiter laufen lasse bekomme ich diese Fehlermeldung:
Code:
Problemsignatur:
  Problemereignisname:   BEX
  Anwendungsname:   Project1.exe
  Anwendungsversion:   0.0.0.0
  Anwendungszeitstempel:   4bf0663d
  Fehlermodulname:   ntdll.dll
  Fehlermodulversion:   6.0.6002.18005
  Fehlermodulzeitstempel:   49e03821
  Ausnahmeoffset:   00009a3a
  Ausnahmecode:   c0000409
  Ausnahmedaten:   00000000
  Betriebsystemversion:   6.0.6002.2.2.0.256.1
  Gebietsschema-ID:   1031
  Zusatzinformation 1:   c024
  Zusatzinformation 2:   be9414e1f9cf32517da0d4512e5d2663
  Zusatzinformation 3:   c024
  Zusatzinformation 4:   be9414e1f9cf32517da0d4512e5d2663
Aber ich hab keine Ahnung warum bzw wo der Fehler liegt
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 07:00
Die DLL ist auch im Anwendungsverzeichnis oder in System32?
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 08:03
ersetze mal alle PChar durch PAnsiChar's. In D2009 ist der Datentyp PChar ein Unicodestring. Und ob deine API mit Unicode arbeitet ...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#4

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 15:57
Dll ist im Anwendungsverzeichnis.

Das mit dem PChar teste ich gleich mal.

Tante Edit meint PAnsiChar bringt auf keinen Fall neue Fehler.
Ich hab nun noch ShareMem rausgeworfen und nun klappts auch.

Naja zumindestens sehe ich nun mal das Formular.
Aber wenn ich nun eine Api funktion aufrufe dann bekomme ich eine Zugriffsverletzung

Bei apiInit() wird bei dem C++ Header ein void Typ übergeben der nach Dr.Bobs Tutorial als Pointer übersetzt werden soll.
Wenn ich das richtig sehe muss hier ein Handle übergeben werden.

Jetzt bin ich mir aber nciht sicher welches Handle ich dort übergeben muss bzw wie ich dort an das richtige komme.
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 16:26
Die DLL wird bestimmt gefunden, denn ohne dieses wäre die Anwendung gleich zu Beginn abgebrochen wurden, mit einer Meldung ala "DLL nicht gefunden".

[edit]
PS:
__apiResultBinary(buffer:Byte; ist bestimmt ein PByte
$2B or not $2B
  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#6

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 16:41
Hab ich korrigiert.

In dem Header File sind eine der Parameter mit einem * gekennzeichnet.

z.B. :
Code:
apiGetConfig(const char *,char *);
Nun sollte man den const Parameter nicht weiter beachten habe ich gelesen in einem DLL Tutorial.
Aber der * wurde nicht weiter erähnt.

Bei Dr. Bobs Head Conversion wäre ein char = Char und char * = PChar
Also ist dann auch ein byte = Byte und byte * = PByte?
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 16:49
typ = typ
typ * = pointer auf typ



Allerdings mußt du beachten, daß Char, PChar, String dynamische Typen sind,
bzw. es sind selber keine Typen, sondern Weiterleitungen zu anderen Typen.

Oftmals (in allen Delphi-Versionen bis 2007) entspricht dieses einem AnsiChar, PAnsiChar und AnsiString,
wärend Delphi 2009/2010 ja auf Unicode eingestellt ist ... somit wird dieses nach WideChar, PWideChar und WideString UnicodeString umgeleitet.

Blos weil dein Delphi jetzt auf Unicode eingestellt ist, ändert sich natürlich nicht gleich dei verwendete DLL.
(tja und nun rächt es sich, daß Viele bei der Deklaration von Schnittstellen keine festen Typen verwenden)
$2B or not $2B
  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#8

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 18:07
Ok das ist soweit klar.
Aber nun hab ich noch das Problem mit dem Handle.

Ich hab mir mal die .NET Version angeschaut die eigentlich auch nur ein Wrapper für die DLL ist die ich verwende.
Aber da werd ich aus der Zuweisung nicht schlau.
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 19:21
IIRC muss man bei einem void-Parameter gar nichts übergeben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 21:24
Moin Markus,

bei der Verwendung von Headern verwende ich immer const, auch bei Ausgabeparametern (in Delphi ist es allerdings üblich bei Ausgabeparametern var zu verwenden)

Begründung:
Bei C ist es üblich, dass bei Ausgabeparametern ein Pointer auf den Speicherbereich übergeben wird, in dem die Funktion den Wert ablegen kann. De Facto sind die Parameter also immer const.
Dadurch, dass ich diese Parameter mit const deklariere kann ich auch nil übergeben.
Gerade bei Funktionen der Windows-API kommt es häufig vor, dass man auch nil bei einem Ausgabeparameter angeben kann, wenn man den Rückgabewert nicht benötigt. Wird dieser dann, wie in Delphi üblich, als var deklariert, kann man dass nicht machen.

Ohne die Angabe const, var, out ist es ein Wert-Parameter, der als Kopie an die Funktion übergeben wird, so dass Änderungen des Wertes durch die Funktion nicht auf den Wert einer eventuell übergebenen Variablen durchschlagen.
Da dies bei C-Funktionen nicht vorkommen kann, macht es für mich auch keinen Sinn hier einen Wert-Parameter anzugeben.

Man kann es natürlich auch ohne const und ggf. mir var machen, aber das ist auch Geschmackssache.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz