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 2 von 2     12   
ryLIX

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

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 23:09
Zitat von DeddyH:
IIRC muss man bei einem void-Parameter gar nichts übergeben.
Dachte ich auch.

@Christian:
Danke für den Hinweis.

Ich hab jetzt grad mal beides probiert:
Nichts übergeben (Parameter komplett gestrichen) und Parameter auf const und nil übergeben.

Das einzige was sich verändert ist die Adresse wo die Zugriffsverletzung auftritt.

Wenn ich ohne Parameter aufrufe:

Zugriffsverletzung bei Adresse 1000105C in Modul 'api32.dll'. Schreiben von Adresse 0044B749

Wenn ich nil übergebe dann schlägt der Versuch beim schreiben auf die Adresse 00000000.

Ich der Dokumentation der API wird hier auch kein Parameter angegeben.
Deswegen würde ich auch darauf tippen das nichts übergeben wird.
Nur wie man sieht führt das auch nicht zum Erfolg.
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 23:10
Moin Markus,

bist Du sicher, dass die Aufrufkonvention stdcall richtig ist?
Es könnte, z.B., auch cdecl sein.
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
ryLIX

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

Re: Probleme beim einbinden einer DLL

  Alt 17. Mai 2010, 23:18
Zitat von Christian Seehase:
Moin Markus,

bist Du sicher, dass die Aufrufkonvention stdcall richtig ist?
Es könnte, z.B., auch cdecl sein.
Der Header ist als extern "C" gekennzeichnet und die aufrufe laufen über FAR PASCAL.

Ich hab mal mit cdecl aufgerufen. Bringt aber auch keine Änderung.

Was mir aber noch aufgefallen ist in dem .NET Wrapper:
Delphi-Quellcode:
[DllImport('api32.dll', EntryPoint='__apiInit', CharSet=CharSet.Ansi)]
strict private class extern function __api32Init([Out] var A_0: Cardinal): boolean; static;
Hier ist der Parameter als OUT gekennzeichnet und vom Typ Cardinal.

Edit:
Um das vollständig zu halten hier noch der eigentliche Aufruf der importierten Funktion:
Delphi-Quellcode:
function API.apiInit: boolean;
begin
    Result := API.__api32Init(@(API.a))
end;
strict private class var a: Cardinal;
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
ryLIX

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

Re: Probleme beim einbinden einer DLL

  Alt 18. Mai 2010, 17:42
Ich bin noch mal ein wenig auf die Suche gegangen nach dem Fehler.
Dabei bin ich auch diese Seite gestoßen: http://rvelthuis.de/articles/article...ml#constparams

Dort heißt es:
Zitat:
One case that is really annoying is FAR PASCAL. You might expect this to be translated to far; pascal; but this is far from the truth. In 32-bit Windows, PASCAL seems to be #defined as __stdcall, and FAR as an empty macro (far is something that was necessary for segmented 16-bit DOS/Windows 3.x code, not for Windows 32-bit code). So to find out the correct calling convention may require some detective work. A good searching tool, like grep, can help you with this.
Ich hab nun zwei Header Files hier.
Eine Api.h und eine ApiDll.h, ich gehe nun mal davon aus das ich die ApiDLL.h beachten sollte da hier die Macros definiert sind.

Dort ist apiInit so definiert:
Code:
APIBOOL FAR PASCAL __apiInit(unsigned int far *handle);
Wie finde ich nun raus was ich zum aufruf der DLL verwenden muss?

Tante edit meint:
Oh es ist was passiert.
Ich hab den Beitrag mal weiter gelesen und bin auf diese Passage gestoßen:
Zitat:
Out parameters

If the header was translated with a MIDL compiler, you'll get hints like [in] or [out] etc. These are in fact quite helpful, since they tell you how the parameter will be used. An [in, out] parameter will probably be modified, so you should use var for these (please note my proviso above). An [out] parameter will be modified too, but can be uninitialized before it is passed. Normally, you could also use var here, but not if the parameter is a pointer to an interface type (please note, that these are translated as the type itself, since in Delphi these are implicit pointers types, just like objects). If you see an [out] or OUT comment or macro with an interface type, please declare these as out too. This is important for the reference counting mechanism.
Jetzt weiß ich ja aus dem Wrapper für .NEt das der Parameter dort als OUT gekennzeichnet ist.
Also hab ich nun folgendes probiert:
function __apiInit(Out handle:Pointer): Boolean; stdcall; external 'api32.dll'; Aufruf:
__apiInit(Handle) //Handle ist von Typ Pointer aber nicht initialisiert bzw belegt Interessant ist nun das nichts passiert.
Also keine Fehlermeldung aber der Server den die Dll starten sollte startet auch nicht...

Edit²:
Ich sehe nun im CPU Fenster das die DLL geladen wird.
Ich hab nun auch herrausgefunden was ich als Parameter übergeben muss:
Zitat:
3. Applikations-Locking ueber Handle:
Die API-Schnittstellenfunktionen __apiInit/__apiInitExt vergeben als Ergebnis einen Handle vom Typ "unsigned int", welcher dann jeder anderen API-Schnittstellenfunktion als 1. Parameter uebergeben werden muss. Mit diesem Mechanismus des Applikations-Lockings kann nun von verschiedenen Prozessen auf EDIABAS zugegriffen werden, ohne API zwischenzeitlich zurueckzusetzen.
Voraussetzung hierfuer ist jedoch, dass die beteiligten Prozesse den Handle kennen.
Wie bekomme ich das korrekte Handle in Delphi?
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
ryLIX

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

Re: Probleme beim einbinden einer DLL

  Alt 20. Mai 2010, 12:51
*bump*
Keiner der mir helfen kann?
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#16

Re: Probleme beim einbinden einer DLL

  Alt 20. Mai 2010, 13:04
Wenn Handle vom Typ unsigned int ist, müsste es doch in Delphi als Cardinal definiert werden und nicht als Pointer, oder?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
ryLIX

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

Re: Probleme beim einbinden einer DLL

  Alt 20. Mai 2010, 13:12
Ich habe es auch schon mit dem Typ Cardinal versucht.
Seltsam ist das er in die DLL einsteigt und dort auch einiges läuft.
Was aber nur über das CPU Fenster sehen kann da ich keinen Quellcode zu der DLL habe.

Und ASM kann ich nicht.

Eigentlich müsste es so sein das nach dem Aufruf von apiInit der Komunikations Server startet.
Danach ist das ganze einsatzbereit und ich kann via apiJob Aufträge senden und die Ergebnisse via apiResult abrufen.

Nur leider startet der Komunikations Server nicht.
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:56 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