Seite 1 von 2
GetServiceName() über eine DLL aufrufen
Verfasst: 12.08.2008 22:46
von funk.munich
Hi zusammen,
ich möchte gerne über eine DLL herausfinden, ob der angegebene Dienst
existiert.
Code: Alles auswählen
; CallDll.exe
OpenLibrary(0, "Service.dll")
myCall = CallFunction(0, "ExistService", "ClipSrv")
CloseLibrary(0)
Code: Alles auswählen
; Service.dll
ProcedureDLL.s ExistService(Service.s)
Protected ServiceName.s
ExamimeServices()
While NextServices()
ServiceName.s = GetServiceName()
If ServiceName = Service
MessageRequester("", ServiceName)
EndIf
Wend
ProcedureReturn result
EndProcedure
Wenn ich nur GetServiceName() über die DLL aufrufe funktioniert es.
Jedoch immer wenn ich "ServiceName" nutze erhalte ich eine Invalid
Memory Address.
Hat jemand eine Idee was ich da falsch mache?
Danke + Gruß,
Daniel
Verfasst: 13.08.2008 00:02
von HeX0R
Ich hatte mir das mal in der Art zum PBOSL-Service dazugebastelt:
Code: Alles auswählen
ProcedureDLL.l IsService(ServiceName.s)
Protected Result.l, schSCManager.l
schSCManager = OpenSCManager_(0, 0, #SRSC_MANAGER_ALL_ACCESS)
If schSCManager
Result = OpenService_(schSCManager, @ServiceName, #SRSERVICE_ALL_ACCESS)
If Result
CloseServiceHandle_(Result)
EndIf
CloseServiceHandle_(schSCManager)
EndIf
ProcedureReturn Result
EndProcedure
Verfasst: 13.08.2008 00:56
von Kaeru Gaman
"ServiceName" ist ein lokaler string innerhalb der prozedur innerhalb der DLL.
sobald du die Proc beendest, existiert der String nicht mehr,
und ein Zugriff darauf landet natürlich in einem ungültigen speicherbereich.
du könntest z.b. deine DLL Proc so einrichten, dass sie einen pointer zu einem String erhält,
in den sie das ergebnis von GetServiceName dann reinschreibt.
aber:
was sind ExamimeServices, NextServices (da ist das s am ende zuviel) und GetServiceName überhaupt für Funktionen?
wenn du code postest, des sich auf eine nicht native Lib bezieht, erwähne das doch bitte auch.
Verfasst: 13.08.2008 09:20
von funk.munich
Hi zusammen,
danke für die Info.
Generell nutze ich hierfür PB4.2 + PBOSL-Service.
@HeXOR,
wenn ich Deinen Code nutze erhalte ich die Fehlermeldung, dass #SRSC_MANAGER_ALL_ACCESS nicht existiert (-> Constant not found ...).
@Kaeru,
das Paket von PBOSL nutzt "ExamimeServices()" sowie auch "NextServices()".
Meinst Du soetwas?
Code: Alles auswählen
; CallDll.exe
*Buffer = AllocateMemory(256)
*Pointer = *Buffer
CopyMemoryString("ClipSrv", @*Pointer)
OpenLibrary(0, "Service.dll")
myCall = CallFunction(0, "ExistService", *Buffer)
CloseLibrary(0)
Code: Alles auswählen
; Service.dll
ProcedureDLL.s ExistService(*Service)
Protected tmpResult.s = "0"
ExamimeServices()
While NextServices()
If GetServiceName() = PeekS(*Service)
MessageRequester("", "wahr")
EndIf
Wend
;FreeMemory(*Service)
ProcedureReturn result
EndProcedure
Jedoch auch dort habe ich das Problem, dass ich ein Invalid Memory erhalte.
War der Aufruf eines Pointers falsch oder habe ich noch etwas falsch gemacht?
Danke + Gruß,
Daniel
Verfasst: 13.08.2008 12:36
von HeX0R
Mein Gott Leute, ist Eigeninitiative dermassen aus der Mode gekommen ?
Code: Alles auswählen
#SRSC_MANAGER_ALL_ACCESS = $F003F
#SRSERVICE_ALL_ACCESS = $F01FF
Wenn du schon die
OpenSource-Libs benutzt, hättest du ja wenigstens auch auf die Idee kommen können dort mal in die Sources zu schauen...
Verfasst: 13.08.2008 22:42
von funk.munich
Hi HeXOR,
danke für die nette Antwort.
Generell hast Du Recht und beim nächsten Mal schaue ich mir vorher
die sourcen an. Diese hatte ich leider in dem Moment nicht heruntergeladen gehabt.
Verfasst: 13.08.2008 23:33
von HeX0R
funk.munich hat geschrieben:
danke für die nette Antwort.
Ein Schlag mit dem Zaunpfahl hilft meist mehr, als ein freundliches anstupsen

Verfasst: 14.08.2008 15:54
von funk.munich
Hi zusammen,
bei folgenden Code taucht auch ein "Invalid Memory Access. (read error at address 0)" auf. Also immer wenn ich innerhalb einer Procedure
NTService prozeduren aufrufe taucht das Problem auf.
Code: Alles auswählen
; Invalid Memory Access.
Procedure ExistService()
ExamimeServices()
While NextServices()
Debug GetServiceName()
Wend
EndProcedure
ExistService()
Nur wenn ich folgendes nutze funxt es einwandfrei.
Code: Alles auswählen
ExamimeServices()
While NextServices()
Debug GetServiceName()
Wend
Woran kann das liegen?
Danke + Gruß,
Daniel
Verfasst: 14.08.2008 16:24
von HeX0R
Hast du Threadsafe aktiviert ?
Verfasst: 14.08.2008 16:48
von funk.munich
Hi HeXOR,
ich habe beides schon ausprobiert gehabt. Also mit oder ohne ThreadSafe
erhalte ich das Problem
Wenn Du den Code Schnipsel bei Dir laufen lässt, erhältst Du keinen Fehler?
Danke,
Daniel