Hi,
<br><br>
ja, ich habe schon wieder ein Problem ...
<br><br>
Ich benutze zu Überwachen der CPU Auslastung den Performance Data Helper, die Funktionen dafür habe ich in eine DLL verpackt. Beim Laden der DLL Initialisiere ich im DLLEntryPoint den PDH.<br>
Unter Win2000 & XP gibt es da auch keine Probleme, aber unter NT 4.0. Zuerst habe ich mir die DLL von der MS Seite gezogen (gut das im PSDK nicht stand das die bei NT 4.0 nicht dabei ist). Und dann mein Programm gestartet.<br>
Und was musste ich feststellen bei PdhAddCounter(...) bleibt das Programm einfach hängen.<br>
Ich habe aber die richtigen Parameter übergeben, denn wenn ich den Counter in einer normalen Prozedur, in der DLL, aufrufe funktioniert alles wunderbar.<br>
Das Problem muß also mit dem EntryPoint zusammenhängen. Leider hab ich keine Ahnung was das sein kann, hat von euch jemand eine Idee?<br>
<br><br>
Bye Martin
<br><br>
Ein wenig Quellcode:
<br>
<pre>
const
{ ist für NT 4.0 anders... }
CPU_USAGE = '\Prozessor(_Total)\Prozessorzeit (%)';
<br>
...
<br>
procedure DllEntryPoint(Reason: Integer);
const
CPU_MONITOR_START_KEY = 'PerfStats\StartStat';
CPU_MONITOR_STOP_KEY = 'PerfStats\StopStat';
CPU_MONITOR_VALUE = 'KERNEL\CPUUsage';
<br>
var
Dummy: array[0..1024] of Integer;
OSVersionInfo: TOSVersionInfo;
Registry: TRegistry;
ReturnValue: Longword;
<br>
begin
{ beim laden der DLL das Betriebssystem ermitteln }
<br>
case Reason of
DLL_PROCESS_ATTACH:
begin
OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
GetVersionEx(OSVersionInfo);
<br>
case OSVersionInfo.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS:
begin
OSPlatform := osWin9x;
<br>
...
<br>
end;
VER_PLATFORM_WIN32_NT:
begin
OSPlatform := osWinNT;
<br>
{ CPU Überwachung von WinNT aktivieren }
<br>
try
ReturnValue := PdhOpenQuery(nil, 0, PdhQuery);
<br>
case ReturnValue of
ERROR_SUCCESS: ;
PDH_INVALID_ARGUMENT,
PDH_MEMORY_ALLOCATION_FAILURE:
raise EPdhError.Create(PDH_ERROR + IntToStr(ReturnValue));
else RaiseLastWin32Error;
end;
<br>
ReturnValue := PdhAddCounter(PdhQuery, PChar(CPU_USAGE), 0,
PdhCounter);
<br>
case ReturnValue of
ERROR_SUCCESS: ;
PDH_CSTATUS_BAD_COUNTERNAME,
PDH_CSTATUS_NO_COUNTER,
PDH_CSTATUS_NO_COUNTERNAME,
PDH_CSTATUS_NO_MACHINE,
PDH_CSTATUS_NO_OBJECT,
PDH_FUNCTION_NOT_FOUND,
PDH_INVALID_ARGUMENT,
PDH_INVALID_HANDLE,
PDH_MEMORY_ALLOCATION_FAILURE:
raise EPdhError.Create(PDH_ERROR + IntToStr(ReturnValue));
else RaiseLastWin32Error;
end;
except
on Exception do;
end;
CoInitialize(nil);
end;
end;
end;
<br>
DLL_PROCESS_DETACH: ...
end;
end;
<br><br>
begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
</pre>
<br><br>
ja, ich habe schon wieder ein Problem ...
<br><br>
Ich benutze zu Überwachen der CPU Auslastung den Performance Data Helper, die Funktionen dafür habe ich in eine DLL verpackt. Beim Laden der DLL Initialisiere ich im DLLEntryPoint den PDH.<br>
Unter Win2000 & XP gibt es da auch keine Probleme, aber unter NT 4.0. Zuerst habe ich mir die DLL von der MS Seite gezogen (gut das im PSDK nicht stand das die bei NT 4.0 nicht dabei ist). Und dann mein Programm gestartet.<br>
Und was musste ich feststellen bei PdhAddCounter(...) bleibt das Programm einfach hängen.<br>
Ich habe aber die richtigen Parameter übergeben, denn wenn ich den Counter in einer normalen Prozedur, in der DLL, aufrufe funktioniert alles wunderbar.<br>
Das Problem muß also mit dem EntryPoint zusammenhängen. Leider hab ich keine Ahnung was das sein kann, hat von euch jemand eine Idee?<br>
<br><br>
Bye Martin
<br><br>
Ein wenig Quellcode:
<br>
<pre>
const
{ ist für NT 4.0 anders... }
CPU_USAGE = '\Prozessor(_Total)\Prozessorzeit (%)';
<br>
...
<br>
procedure DllEntryPoint(Reason: Integer);
const
CPU_MONITOR_START_KEY = 'PerfStats\StartStat';
CPU_MONITOR_STOP_KEY = 'PerfStats\StopStat';
CPU_MONITOR_VALUE = 'KERNEL\CPUUsage';
<br>
var
Dummy: array[0..1024] of Integer;
OSVersionInfo: TOSVersionInfo;
Registry: TRegistry;
ReturnValue: Longword;
<br>
begin
{ beim laden der DLL das Betriebssystem ermitteln }
<br>
case Reason of
DLL_PROCESS_ATTACH:
begin
OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
GetVersionEx(OSVersionInfo);
<br>
case OSVersionInfo.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS:
begin
OSPlatform := osWin9x;
<br>
...
<br>
end;
VER_PLATFORM_WIN32_NT:
begin
OSPlatform := osWinNT;
<br>
{ CPU Überwachung von WinNT aktivieren }
<br>
try
ReturnValue := PdhOpenQuery(nil, 0, PdhQuery);
<br>
case ReturnValue of
ERROR_SUCCESS: ;
PDH_INVALID_ARGUMENT,
PDH_MEMORY_ALLOCATION_FAILURE:
raise EPdhError.Create(PDH_ERROR + IntToStr(ReturnValue));
else RaiseLastWin32Error;
end;
<br>
ReturnValue := PdhAddCounter(PdhQuery, PChar(CPU_USAGE), 0,
PdhCounter);
<br>
case ReturnValue of
ERROR_SUCCESS: ;
PDH_CSTATUS_BAD_COUNTERNAME,
PDH_CSTATUS_NO_COUNTER,
PDH_CSTATUS_NO_COUNTERNAME,
PDH_CSTATUS_NO_MACHINE,
PDH_CSTATUS_NO_OBJECT,
PDH_FUNCTION_NOT_FOUND,
PDH_INVALID_ARGUMENT,
PDH_INVALID_HANDLE,
PDH_MEMORY_ALLOCATION_FAILURE:
raise EPdhError.Create(PDH_ERROR + IntToStr(ReturnValue));
else RaiseLastWin32Error;
end;
except
on Exception do;
end;
CoInitialize(nil);
end;
end;
end;
<br>
DLL_PROCESS_DETACH: ...
end;
end;
<br><br>
begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
</pre>
Comment