[python] py2exe dll export

superman feed na centrum.cz
Pátek Květen 30 18:50:17 CEST 2008


 >Vymyslel jsem dva postupy, ale ani u jednoho jsem nebyl dostatecne 
uspesny:
 >a) Puvodni zamer byl udelat v Ccku skeleton DLL knihovny a v ni pomoci
 >elmeru (http://elmer.sourceforge.net/) zapouzdrit python kod. To temer 
fungovalo.

A nebylo by jednodušší rovnou použít Python C API? Podle mě by to nebylo
tak těžké zapouzdřit těch pár funkcí.

 >b) Druhy postup predpoklada, ze jsem schopny pomoci py2exe vytvorit
 >DLL knihovnu primo z cisteho python kodu. I zde jsem byl uspesny a povedlo
 >se mi zkompilovat DLL knihovnu. Kdyz se ale podivam na exporty, ktere ta
 >knihovna ma, vidim tam pouze zakladni DllRegisterServer, DllGetClassObject
 >a dalsi, ktere ma kazdy COM DLL. Hloubam tady nad tim uz kolik hodin,
 >Google moc nepomohl (asi to moc lidi nepotrebuje) a nevim, jak tam dostat
 >sve vlasni exporty. Zajimave je, ze uvnitr kodu te DLL knihovny existuje
 >retezec "Vysledek", takze to ten skript my_com_server.py (viz. priloha)
 >s funkcemi obsahuje.

Což je naprosto v pořádku, protože COM nepotřebuje exportovat funkce
jako DLL exporty, protože COM mechanismus má svůj vlastní mechanismus
binárně přenostitelných objektů s metodami. Takže to co jste získal je zcela
správné.

COM server musíte ve Windows zaregistrovat pomocí utilitky comsrv32.exe.

Abych vysvětlil COM funguje tak, že vytváří přenositelné třídy (jejichž 
binární
rozhraní je přesně určeno, takže tuto třídu můžete použít v jakémkoli
programovacím jazyce). COM server tedy exportuje několik různch tříd,
v řeči COMu zvaných interface a ani ty třídy nexportuje na úrovni DLL, 
ale má
k tomu svůj vlastní mechanismus pomocí volání Windows API funkcí začínající
na Co* - a kterými dostanete vše potřebné - tedy v C ukazatel na objekt dané
třídy (interface), a tím tedy i na virtuální tabulku metod této třídy, 
přes kterou
dané metody třídy voláte. Musíte předem znát, jaká je struktura třídy, pokud
to nechcete složitěji zjišťovat pomocí typové knihovny.

Osobně si myslím, že bez bližších znalostí kolem COM záležitostí v C (pokud
tedy tím druhým bindovaným jazykem je C) cestu b)
rovnou vzdejte. Pokud chcete Python nabindovat s jazykem s dobrou podporou
COMu (Visual Basic, Microsoft Office, Delphi, C++ Builder, C#, atd..) pak
je to primitivní.

Miloslav Ponkrác


Další informace o konferenci Python