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);