Nemám moc rád technologii COM, hlavně protože jinak k prakticky samostatnému EXE vygenerovaného Delphi (případně s dalšími DLL v adresáři programu) zavádí závislosti na něčem, co musí být registrované v systému, což je z mého pohledu zásadní problém a moc se to neslučuje s mojí filozofií programů.
Nedávno jsem narazil na možnost použití COM bez registrace v systému, jen s tím, že do manifestu Vašeho programu vygenerujete patřičné informace. Pokud máte rozumně staré Delphi lze manifest přímo z IDE začlenit, pokud Vaše Delphi jsou z přelomu tisíciletí, musíte buďto si pomoci sami, nebo patřičný manifest přiložit k exe (stejně je tomu mimochodem u VB6).
Mechanismus Registration-free COM by měl být podporován od XP SP2.
Manifest vypadá nějak takto (zde z trial verze emailarchitect), sledujte věci ohledně comClass a comInterfaceExternalProxyStub.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
</dependentAssembly>
</dependency>
<file name="EAGetMailObj.dll" hashalg="SHA1">
<comClass clsid="{953EFD7C-8FCE-4D9C-9BD9-E6F19A1B7FC9}" tlbid="{5FA52C10-18FC-4D81-8542-50F9A2DC60A3}" description="MailClient Class"></comClass>
<comClass clsid="{AD59203B-0C25-4192-98F2-C680D6A16738}" tlbid="{5FA52C10-18FC-4D81-8542-50F9A2DC60A3}" description="Attachment Class"></comClass>
…………..
<typelib tlbid="{5FA52C10-18FC-4D81-8542-50F9A2DC60A3}" resourceid="1" version="1.0" helpdir="" flags="HASDISKIMAGE"></typelib>
</file>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<comInterfaceExternalProxyStub name="IMailClient" iid="{F7463672-BDA9-428F-8A03-E30C0F1B7EA8}" tlbid="{5FA52C10-18FC-4D81-8542-50F9A2DC60A3}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
<comInterfaceExternalProxyStub name="IImap4Folder" iid="{860EA4DE-9B7D-4C1B-8DC0-67B74B981F41}" tlbid="{5FA52C10-18FC-4D81-8542-50F9A2DC60A3}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
……….
</assembly>
Samozřejmě je nesmysl to psát manuálně. Součástí instalace Windows SDK je malý prográmek mt.exe
"c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\mt.exe"
-tlb:EAGetMailObj.dll -dll:EAGetMailObj.dll -out:EAGetMailObj.dll.manifest
který udělá špinavou práci za Vás. Měl by být schopen manifest i přímo vložit do exe jen změnou out parametru na cílový exe.
Nyní jen stačí manifest doplnit např. o sekci Common Controls 6.0 (jak je naznačeno výše).
Tak a v Project Options nastavte nový manifest
V případě volby Manifest File - none lze použít i jen přiložení manifestu k souboru, např. Project1.exe.manifest
A to by mělo být vše a můžete šťastně používat COM bez registrace.
P.S.: Stejně je lepší mít zdrojáky.
Datum: 2016-10-18 20:58:00 Tagy: praxe