Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi rufId.dll aus Windows Dienst ansprechen (LoadLibrary) (https://www.delphipraxis.net/155656-rufid-dll-aus-windows-dienst-ansprechen-loadlibrary.html)

AliDi 2. Nov 2010 20:10

Delphi-Version: 6

rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Hallo zusammen,

Ich nutze den Beispielcode aus folgendem Thread um die rufId.dll der Klicktel/Rufident CD anzusprehen. Das ganze ermöglicht eine Rückwärtsuche in der Klicktel Datenbank.

http://www.delphipraxis.net/61170-ru...nd-nutzen.html

Das ganze funktioniert in einer normalen Anwendung einwandfrei, wenn ich allerdings den Code in einen Dienst stecke startet dieser erst gar nicht.

Fehlermeldung:
"Runtime error 217 at 000112A7" und anschließend
"Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung."

Es reicht schon folgendes in den initialization Abschnitt der Unit zu stecken:

Delphi-Quellcode:
initialization


DllHdl := 0;
FuncPtr := Nil;


DLLPath:= DllPath + 'rufid.dll';

DllHdl := LoadLibrary(PChar (DLLPath));

if DllHdl > 0 then
  begin
    FuncPtr := GetProcAddress( DllHdl, 'SucheTelefonnummer' );
    if FuncPtr <> nil then @PSucheTelefonnummer := FuncPtr;

    FuncPtr := GetProcAddress( DllHdl, 'UseVersion' );
    if FuncPtr <> nil then @PUseVersion := FuncPtr;

  end;
DllHdl ist nach Aufruf von LoadLibrary0, GetLastError ist auch 0 (getestet mit Messageboxen). Gehe ich den Code in Einzelschritten durch hat DllHdl einen Wert > 0 und GetLastError liefert wieder 0. Ich verstehe nicht wieso LoadLibrary mir kein Handle für die DLL gibt obwohl GetLastError behauptet das alles ok war.

Was mache ich falsch?

Vielen Dank schon mal
AliDi

mkinzler 2. Nov 2010 20:14

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
-Was steht den in DllPath?
-Hat der Dienst-Owner Zugriff auf diesen?

AliDi 2. Nov 2010 20:31

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Hi,
Zitat:

Zitat von mkinzler (Beitrag 1059238)
-Was steht den in DllPath?
-Hat der Dienst-Owner Zugriff auf diesen?

In DllPath steht der Pfad zur DLL, das passt auch. Wenn ich das ganze so hardcode tritt das Problem auch auf:

Delphi-Quellcode:
DllHdl := LoadLibrary('F:\Projekte\Delphi\RService\rufid.dll');

Der Dienst und die DLL liegen in einem Verzeichnis. Zugriffsrechte sollten auch passen, der Dienst läuft unter dem Lokalen Systemkonto. Dieser hat Vollzugriff auf das Verzeichnis.

Gruß
Alidi

Sir Rufo 2. Nov 2010 20:37

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Starte den Dienst unter einem Benutzerkonto wo der Zugriff als Anwendung funktioniert.
(z.B. als Administrator)

Ich vermute mal die DLL braucht irgendein Geraffel, was diese nur in dem Userprofil findet und der Systemuser hat halt keins.

mkinzler 2. Nov 2010 20:37

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Handelt es sich um ein lokales Laufwerk?

AliDi 2. Nov 2010 20:44

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Hi,

Ja, ist ein lokales Laufwerk.

Wenn ich den Dienst als Admnistrator starte ist es der gleiche Effekt. In einer normalen Anwendung funktioniert es als Administrator.

Kann man eine DLL eigentlich so bauen, das sie nicht mit einem Dienst funktioniert?

Gruß
AliDi

Luckie 2. Nov 2010 20:47

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Warum muss es denn überhaupt ein Dienst sein?

AliDi 2. Nov 2010 20:54

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Hi,

Zitat:

Zitat von Luckie (Beitrag 1059245)
Warum muss es denn überhaupt ein Dienst sein?

Es muß nicht zwingend ein Dienst sein, wäre aber schön. Das ganze soll im Hintergrund laufen und Anfragen per TCP beantworten. Mich interessiert aber auch warum das nicht funktioniert.

Gruß
Alidi

Luckie 2. Nov 2010 21:03

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Mit Dienst und Netzwerk wirst du noch mehr Probleme bekommen, da das Systemkonto in der Regel keinen Zugriff auf das Netzwerk hat.

AliDi 2. Nov 2010 21:19

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Hi,

Zitat:

Zitat von Luckie (Beitrag 1059249)
Mit Dienst und Netzwerk wirst du noch mehr Probleme bekommen, da das Systemkonto in der Regel keinen Zugriff auf das Netzwerk hat.

Also die Netzwerk Sachen laufen (Indy TCP Server und TCP Client). Ich hab das ganze jetzt mal in ne eigene DLL gepackt die ich aus meinem Dienst anspreche, der gleiche Effekt. Sobald der initialization Abschnitt der eigenen DLL (DllHdl := LoadLibrary(PChar (DLLPath))) durchlaufen wird tritt das Problem wieder auf :?

Gruß
Alidi


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr.
Seite 1 von 2  1 2      

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