Announcement

Collapse
No announcement yet.

PDH im DLLEntryPoint (Alias DLLProc) Initialisieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PDH im DLLEntryPoint (Alias DLLProc) Initialisieren

    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>

  • #2
    Hi Martin,<p>
    das ist ein bekanntes Problem, da PDH intern wohl auch mit Threads arbeitet, somit kommt es zu einem Deadlock. Du musst also den Aufruf nach der Abarbeitung von DLL_PROCESS_ATTACH ausführen, zumindest ist das die einzige Lösung, von der ich gehört habe.<br>
    Näheres wird uns bestimmt bald ein Profi erläutern ;-)<p>
    Gruß,<br>
    Marku

    Comment


    • #3
      Thx, werd das gleich mal probieren..

      Comment


      • #4
        Ja, wie erwartet funktioniert alles wenn ich es separat (nicht im EntryPoint) aufrufe.
        Doch ist dachte der EntryPoint ist zum Initialisieren der Daten da....

        Genau das selbe Problem hatte ich auch mit CoUninitialize, darum würde mich schon mal interessieren woran das nun liegt..

        Comment

        Working...
        X