Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

[Windows Update 03/2017 Problem] CompPkgSup.DLL schießt eigenes Programm ab

  Alt 17. Mär 2017, 16:06
Hallo,
seit Installation der aktuellen Windows-Updates (speziell unter Windows 10) kommt es zu Störungen bei der Ausführung von Programmen vieler Hersteller.
Auch die Ausführung von meinem Programm ist betroffen. Es äußert sich in der Meldung „[Programmname] reagiert nicht mehr“ und der folgenden Anzeige:

Zitat:
"Programm" funktioniert nicht mehr, es wird nach einer Lösung für das Problem gesucht [Durchlaufender Balken] - - -
Das Programm wird aufgrund eines Problems nicht richtig ausgeführt. Das Programm wird geschlossen und Sie werden benachrichtigt, wenn eine Lösung verfügbar ist.
Erste Recherchen haben ergeben, dass dies kein eigentliches Problem von meinem Programm ist, sondern ein Problem verursacht durch die Medien-Komponenten von Windows, die wir für die Wiedergabe von Videos [zwangsläufig] verwenden [müssen].

Zur Info:
In den Suchergebnissen, sozialen Netzwerken und div. Foren gibt es aktuell (17.03.17) mehrere Lösungsansätze:
1) KB4013429 deinstallieren und Windows-Updates deaktivieren (Kontaktieren Sie hierzu Ihren Admin)
2) CompPkgSup.DLL von Dezember 2016 von einem nicht-aktualisierten PC kopieren und auf den betroffenen PCs unter C:\Windows\System32\CompPkgSup.DLL ersetzen. Benutzer berichten von Erfolg, jedoch ist generell davon abzuraten, da die anderen -aktualisierten- Systemdateien nicht garantiert mit dieser Version kompatibel sind und dies weitere Probleme hervorrufen kann. Zusätzlich muss die Datei auf Dateisystemebene Schreibzugriffen „Jeder“ (Jedem) verweigern. Auch davon wird generell von uns abgeraten.

https://www.reddit.com/r/sysadmin/co..._applications/
„Workaround“: CompPkgSup.dll von anderem PC kopiert, der noch nicht aktualisiert ist

Viele Programme haben aktuell das Problem: Windows Explorer, Windows Media Player, PowerDVD, …
https://www.google.de/search?q=CompP...w=1733&bih=916

Letztendlich hängt es irgendwie mit DVD/MPEG zusammen. An mehreren Stellen wird betont, dass Microsoft reparieren muss; Wir Programmierer können nix tun(?).

https://answers.microsoft.com/en-us/...2-c95b4f40d978



Der Fehler zeigt sich wie folgt im Ereignisprotokoll:
Zitat:
Fehlerbucket 108798616406, Typ 1

Ereignisname: APPCRASH

Antwort: Nicht verfügbar

CAB-Datei-ID: 0



Problemsignatur:

P1: Programm.exe

P2: 0.0.0.0

P3: 58cbc003

P4: CompPkgSup.DLL

P5: 10.0.14393.953

P6: 58ba5a1f

P7: c0000005

P8: 0000346b

P9:

P10:



Angefügte Dateien:

\\?\C:\ProgramData\Microsoft\Windows\WER\Temp\WER1 DB9.tmp.WERInternalMetadata.xml



Diese Dateien befinden sich möglicherweise hier:

C:\ProgramData\Microsoft\Windows\WER\ReportArchive \AppCrash_Planer.exe_63d47c1dfd94df8be758496664da2 08c7e217f25_ac402c4f_21144575



Analysesymbol:

Es wird erneut nach einer Lösung gesucht: 0

Berichts-ID: 454271e6-5b02-4cda-b56b-72fcf29174e7

Berichtstatus: 1

Bucket mit Hash: d310656fb3f0f08c78308020e24f49af


Das Problem hängt explizit mit der Datei Windows-Systemdatei „CompPkgSup.DLL“ zusammen, und betrifft nicht ausschließlich aber speziell MPEG-Dateien. Die Suche bei Google nach „CompPkgSup.DLL“ in Verbindung mit neuen Ergebnissen innerhalb der letzten 24 Stunden zeigt zahlreiche betroffene Benutzer und Programme, auch den „Windows-Explorer“ und „Windows Media Player“, soweit z.B. CyberLink PowerDVD und „Notepad++“.



Was kann man nun als Entwickler tun?

In Delhi tritt der Fehler auch während dem Debuggen auf, in meinem Beispiel erzeuge ich Minibilder/Thumbnails von Mediendateien, hier konkret Videos:

Zitat:
:0f05346b ; C:\Windows\SysWOW64\CompPkgSup.DLL
:0f05417a ; C:\Windows\SysWOW64\CompPkgSup.DLL
:0f0518e6 ; C:\Windows\SysWOW64\CompPkgSup.DLL
:0f053aa3 CompPkgSup.AreDvdCodecsEnabled + 0x73
:0f04e07c
:0f04d7a9
:10956fea ; C:\Windows\SysWOW64\msmpeg2vdec.dll
:1094103e ; C:\Windows\SysWOW64\msmpeg2vdec.dll
:10940f72 ; C:\Windows\SysWOW64\msmpeg2vdec.dll
:758ac90b ; C:\WINDOWS\SysWOW64\combase.dll
:758b6dfa ; C:\WINDOWS\SysWOW64\combase.dll
:758acef2 ; C:\WINDOWS\SysWOW64\combase.dll
:758b1575 ; C:\WINDOWS\SysWOW64\combase.dll
:758b1640 ; C:\WINDOWS\SysWOW64\combase.dll
:758b16d7 ; C:\WINDOWS\SysWOW64\combase.dll
:758b18f7 ; C:\WINDOWS\SysWOW64\combase.dll
:758b6ddb ; C:\WINDOWS\SysWOW64\combase.dll
:758b2e7d ; C:\WINDOWS\SysWOW64\combase.dll
:758b6de2 ; C:\WINDOWS\SysWOW64\combase.dll
:758f77a0 ; C:\WINDOWS\SysWOW64\combase.dll
:758f6ba2 ; C:\WINDOWS\SysWOW64\combase.dll
:758f8209 combase.CoCreateInstance + 0xa9
:105588a4 ; C:\Windows\SysWOW64\mfds.dll
:10558602 ; C:\Windows\SysWOW64\mfds.dll
:1055757d ; C:\Windows\SysWOW64\mfds.dll
:1055db22 ; C:\Windows\SysWOW64\mfds.dll
:1056a2d3 ; C:\Windows\SysWOW64\mfds.dll
:1056caaf ; C:\Windows\SysWOW64\mfds.dll
:10577b56 ; C:\Windows\SysWOW64\mfds.dll
:105455b3 ; C:\Windows\SysWOW64\mfds.dll
:105468bc ; C:\Windows\SysWOW64\mfds.dll
:1054a943 ; C:\Windows\SysWOW64\mfds.dll
:051a9b1c ; C:\WINDOWS\SysWOW64\RTWorkQ.DLL
:051a932a ; C:\WINDOWS\SysWOW64\RTWorkQ.DLL
:76f27c43 ;
:76f26b56 ;
:765d62c4 KERNEL32.BaseThreadInitThunk + 0x24
:76f50fd9 ;
:76f50fa4 ;
In meinem konkreten Fall konnte ich den Fehler soweit zurückverfolgen:
Delphi-Quellcode:
  { from ShlObjIdl.h }
  IExtractImage = interface
    ['{BB2E617C-0920-11D1-9A0B-00C04FC2D6C1}']
    function GetLocation(Buffer: PWideChar;
                         BufferSize: DWORD;
                         var Priority: DWORD;
                         var Size: TSize;
                         ColorDepth: DWORD;
                         var Flags: DWORD): HResult; stdcall;
    function Extract(var BitmapHandle: HBITMAP): HResult; stdcall;
  end;



   XtractImage.Extract(BmpHandle); // verursacht den Absturzt
   // bzw. OleCheck(XtractImage.Extract(BmpHandle));
XtractImage ist zu dem Zeitpunkt scheinbar gültig ("Pointer($4A8D178) as IExtractImage"), BmpHandle ist 0, aber das wird glaube ich primär als Rückgabewert verwendet. Ab hier ist das eine reine API auf eine Windows-Funktion; ich kann mit dem Debugger nicht tiefer ins Detail gehen.

Was mich nun komplett irritiert ist die Tatsache, dass jede Exceptionbehandlung ins Leere läuft, und Windows mein Programm mit schön großer Fehlermeldung gegen die Wand fährt, anstatt den Fehler -wie vorgesehen- zu ignorieren:
Delphi-Quellcode:
  try
    XtractImage.Extract(BmpHandle);
  except end;
Was kann ich gegen dieses "Programm funktioniert nicht mehr" tun? Warum kommt es? Ja es gab einen Fehler, aber warum greift meine Exception-Behandlung nicht?


Weitere Infos:
-Delphi 2010
-Windows 10 Pro x64, alle Updates
-Sophos AntiVirus
Delphi-Quellcode:
{-------------------------------------------------------------------------------
Unit Name: ShellObjHelper
Author  : hans gulo (HG)
Purpose  : Shell Object helper routines
-------------------------------------------------------------------------------}

unit ShellObjHelper;

...

function ExtractImageGetFileThumbnail(const XtractImage: IExtractImage;
  ImgWidth, ImgHeight, ImgColorDepth: Integer; var Flags: DWORD;
  out RunnableTask: IRunnableTask; out Bmp: TBitmap): Boolean;
var
  Size: TSize;
  Buf: array[0..MAX_PATH] of WideChar;
  BmpHandle: HBITMAP;
  Priority: DWORD;
  GetLocationRes: HRESULT;

  procedure FreeAndNilBitmap;
  begin
    {$IFNDEF DELPHI3}
    FreeAndNil(Bmp);
    {$ELSE}
    Bmp.Free;
    Bmp := nil;
    {$ENDIF}
  end;

begin
  Result := False;
  RunnableTask := nil;
  Size.cx := ImgWidth;
  Size.cy := ImgHeight;
  Priority := IEIT_PRIORITY_NORMAL;
  Flags := Flags or IEIFLAG_ASYNC;
  GetLocationRes := XtractImage.GetLocation(Buf, sizeof(Buf), Priority, Size,
    ImgColorDepth, Flags);

  if (GetLocationRes = NOERROR) or (GetLocationRes = E_PENDING) then
  begin
    if GetLocationRes = E_PENDING then
    begin
      { if QI for IRunnableTask succeed, we can use RunnableTask
        interface pointer later to kill running extraction process.
        We could spawn a new thread here to extract image. }

      if S_OK <> XtractImage.QueryInterface(IRunnableTask, RunnableTask) then
        RunnableTask := nil;
    end;
    Bmp := TBitmap.Create;
    try
      try

      // !!!!!
      // Hier kommt nun die Windows-Fehlermeldung:
      // !!!!!

      OleCheck(XtractImage.Extract(BmpHandle)); // This could consume a long time.
                                                // If RunnableTask is available
                                                // then calling Kill() method
                                                // will immediately abort the process.
      except end;
      Bmp.Handle := BmpHandle;
      Result := True;
    except
      on E: EOleSysError do
      begin
        //-------------
        OutputDebugString(PChar(string(E.ClassName) + ': ' + E.Message));
        //-------------
        FreeAndNilBitmap;
        Result := False;
      end;
      else
      begin
        FreeAndNilBitmap;
        raise;
      end;
    end; { try/except }
  end;
end;
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit
  Mit Zitat antworten Zitat