Delphi-PRAXiS

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

Luckie 2. Nov 2010 22:41

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Ob der Code vom Dienst in einer DLL steckt oder in der Exe direkt, spielt keine Rolle, der Dienst wird trotzdem keinen Zugriff auf das Netzwerk haben, wenn er unter dem Systemkonto läuft.

AliDi 2. Nov 2010 22:48

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

Zitat:

Zitat von Luckie (Beitrag 1059254)
Ob der Code vom Dienst in einer DLL steckt oder in der Exe direkt, spielt keine Rolle, der Dienst wird trotzdem keinen Zugriff auf das Netzwerk haben, wenn er unter dem Systemkonto läuft.

Wie gesagt, die Netzwerk Sachen laufen ja. Indy TCP Client und Server erledigen ihren Job ohne Probleme (auch unter dem Systemkonto). Nur wenn ich die rufId.dll im Service nutzen will gibts Probleme (egal ob Systemkonto oder z.b. Administratorkonto).

Gruß
Alidi

Klaus01 3. Nov 2010 07:55

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Was Michael meint ist,
wenn die DLL auf einem Netzlaufwerk liegt
kann sie nicht geladen werden. Weil
unter dem Systemkonto keine Netzlaufwerke
angehangen werden.

Schau doch mal mit FileExists ob die Datei
gefunden wird.
Die Ausgabe kannst Du ja in ein Logfile schreiben.

Grüße
Klaus

Luckie 3. Nov 2010 08:47

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Meinte ich eigentlich nicht, aber das wäre auch eine Fehlerursache.

mkinzler 3. Nov 2010 09:07

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Er mwinte aber das F ein lokales Laufwerk sei

AliDi 3. Nov 2010 09:14

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Also die Datei existiert (geprüft mit FileExists) und liegt auf einem lokalen laufwerk. Mit einer normalen Anwendung gehts, nur mit einem Dienst nicht.


Gruß
Alidi

Dezipaitor 3. Nov 2010 09:30

AW: rufId.dll aus Windows Dienst ansprechen (LoadLibrary)
 
Nimm doch mal den Code aus dem Initialization raus und packe ihn an den Anfang von ServiceExecute.

AliDi 3. Nov 2010 11:53

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

Zitat von Dezipaitor (Beitrag 1059284)
Nimm doch mal den Code aus dem Initialization raus und packe ihn an den Anfang von ServiceExecute.

gleicher Effekt :(


Gruß
Alidi


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 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