Hallo,
folgendes Problem:
Ich habe ein Klasse und einige Methoden darauf. Eine dieser Methoden übergebe ich nun an den ServiceControlDispatcher um den Dienst zu starten. In dieser übergebenen Methode will bzw. muss ich aber weiterhin auf member-Variablen meines Objektes zugreifen können. In dem Augenblick in dem ich aber auf ein Element der Klasse zugreifen will (ausser einem anderen Methodenaufruf) schmiert mir der Service mit einer Zugriffsverletzung ab.
Etwas anschaulicher:
Delphi-Quellcode:
PhService = class
// Private declarations
private
m_name: string;
[...]
private
procedure doStart;
procedure servicehandler(a_val: integer); stdcall;
procedure serviceProc(a_dwargc: integer; a_lpszargv: PChar); stdcall;
// Proteced declarations
protected
procedure service_main; virtual; protected
property myName: string read m_name write m_name;
// Constructor / Destructor
[...]
// Public declarations
public
procedure Start;
public
property Mode: integer read m_startupmode write m_startupmode;
property Silent: boolean read m_silent write m_silent;
end;
Delphi-Quellcode:
procedure PhService.doStart;
begin;
doDebugOutput('
doStart');
m_dispatcher.lpServiceName := PChar(myName);
m_dispatcher.lpServiceProc := @PhService.serviceProc;
// <-- hier wird die kommende Methode übergeben
doDebugOutput('
Start Dispatcher');
StartServiceCtrlDispatcher(m_dispatcher);
// <-- hier die Übergabe und der Start der Methode
end;
// controls the service execution
//
procedure PhService.serviceProc(a_dwargc: integer; a_lpszargv: PChar);
var
l_name: AnsiString;
begin
doDebugOutput('
begin ServiceProc ' + m_Name);
// <-- hier wird auf die Membervariable zugegriffen: Exception!
m_statushandle := RegisterServiceCtrlHandler(PChar(m_name),
@PhService.ServiceHandler);
doDebugOutput('
has ServiceController');
if (m_statusHandle <> 0)
then
begin
ZeroMemory(@m_status, SizeOf(m_status));
with m_status
do
begin
dwServiceType := SERVICE_WIN32_OWN_PROCESS;
dwCurrentState := SERVICE_START_PENDING;
dwControlsAccepted := SERVICE_ACCEPT_STOP
or
SERVICE_ACCEPT_PAUSE_CONTINUE;
dwWaitHint := 1000;
end;
// of with m_status do
[...]
end;
Ich kann mir das leider gar nicht erklären. Wie kann ich aus der übergebenen Methode jetzt ohne eine Speicherverletzung zu bekommen auf die Eigenschaften der Klasse zugreifen?