Thema: Delphi msxml deinstallieren

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 

Re: msxml deinstallieren

  Alt 2. Feb 2005, 21:31
Ich persönlich prüfe die Existenz von MS-XML mit einer speziellen Funktion gleich zu Beginn. Wird nicht die erwartete Version gefunden, beendet sich das Programm. Bei einem VCL-Projekt ist diese Funktion am besten im Projektquelltext (*.dpr) aufgehoben, noch bevor die ersten Forms geladen werden. In der DP treibt sich noch eine Funktion [dp]"DoesXmlExist"[/dp] rum (auch von mir), aber mittlerweile benutze ich die hier:
Delphi-Quellcode:
function DoesObjectExist(const ClassID: TGUID): boolean;

  function GuidToString(const ClassID: TGUID): string;
  var
    p : PWideChar;
  begin
    Result := '';

    if(Succeeded(StringFromCLSID(ClassID,p))) then
    begin
      Result := p;
      CoTaskMemFree(p);
    end;
  end;

  function ExpandEnvStr(const szInput: string): string;
  const
    MAXSIZE = 32768;
  begin
    SetLength(Result,MAXSIZE);
    SetLength(Result,ExpandEnvironmentStrings(pchar(szInput),
      @Result[1],length(Result)));
  end;

var
  reg : HKEY;
  dwType,
  dwLen : dword;
  s : string;
begin
  Result := false;

  if(RegOpenKeyEx(HKEY_CLASSES_ROOT,pchar('CLSID\' +
    GuidToString(ClassID) + '\InProcServer32'),
    0,KEY_READ,reg) = ERROR_SUCCESS) then
  try
    dwType := REG_NONE;
    dwLen := 0;

    if(RegQueryValueEx(reg,nil,nil,@dwType,nil,@dwLen) = ERROR_SUCCESS) and
      (dwType in [REG_SZ,REG_EXPAND_SZ]) and
      (dwLen > 0) then
    begin
      SetLength(s,dwLen);

      if(RegQueryValueEx(reg,nil,nil,@dwType,@s[1],@dwLen) = ERROR_SUCCESS) then
        SetLength(s,dwLen-1)
      else
        s := '';

      Result := (s <> '') and
        (fileexists(ExpandEnvStr(s)));
    end;
  finally
    RegCloseKey(reg);
  end;
end;
weil sie flexibler ist und nicht nur nach XML suchen kann. Aber für XML 4 würde es so aussehen:
Delphi-Quellcode:
  if(not DoesObjectExist(CLASS_DOMDocument40)) then
  begin
    MessageBox(0,'XML 3 wird benötigt.',nil,MB_OK or MB_ICONEXCLAMATION);
    exit;
  end;
Wie gesagt, klappt nicht nur bei XML. Auch beim Help 2.0-Environment
Delphi-Quellcode:
  if(not DoesObjectExist(CLASS_HxSession)) then
    Halt(3);
  Mit Zitat antworten Zitat