Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 10. červen 2008, 15:25:33 Předmět: Tvorba wraperu C++ -> CLI |
|
|
Chtel bych se zeptat, jestli nekdo nahodou nema zkusenosti s psanim wraperu pro unmanaged C++ knihovnu a pokud jo tak jakej managed jazyk by jste k tomu doporucovali a taky jak to bylo/nebylo tezky.
Edit: Tak to jeste trochu upresnim, chtel sem propojit HAVOK a hru psanou v C#, protoze havok byl uvolnenej teprve nedavno, tak pocitam, ze na to zadnej wrapper jeste neni.
Naposledy upravil Deluxe dne 10. červen 2008, 15:59:13, celkově upraveno 2 krát |
|
Návrat nahoru |
|
|
Yossarian
Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 10. červen 2008, 15:32:45 Předmět: |
|
|
unmanaged c++? ja osobne psal wrapper c++ -> skriptovaci jazyk (ne c#), a udelal sem ho 2vrstvy:
prevod do C (s 1. parametrem objekt ty tridy),
na druhy strane objektovou strukturu ktera to prevadela do C volani, a interface s C se da udelat pomerne jednodusse
.net na to muze mit nejaky prostredky pro primou komunikaci/slinkovani s c++, nicmene ruku do ohne bych za to nedal. |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 10. červen 2008, 15:38:20 Předmět: |
|
|
Pokud nativni knihovna obsahuje jen jednoduche funkce s jednoduchymi parametry (ne objekty), vystacis si s PInvoke. (To jde primo ze C# a asi i z jinych .NET jazyku)
Jinak je vhodne napsat wrapper v C++/CLI.
Doporucuju to nastudovat v MSDN, napriklad zde: http://msdn.microsoft.com/en-us/library/xey702bw.aspx
A jeste je tu moznost pouzit COM (pokud je tva knihovna COM), to jde take primo, jen to neni uplne pohodlne. _________________ - play with objects - www.krkal.org -
Naposledy upravil MD dne 10. červen 2008, 15:40:52, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 10. červen 2008, 15:39:57 Předmět: |
|
|
No taky bych mohl myslet C++/CLR. Proto sem psal unmanaged, aby bylo jasny, ze myslim normalni C++. |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 29. červenec 2008, 16:33:09 Předmět: |
|
|
Jde nejak dostat managed type do nativni funkce, ktera ocekava primo objekt a ne pointer? |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 29. červenec 2008, 21:25:02 Předmět: |
|
|
To bych řekl, že nepůjde.
Jinak nějakou zkušenost mám, použil jsem C++/CLI (tzn. ta novější verze co je ve VS 2005). Nebylo to zas tak těžký... záleží na tom, jak vypadá interface Havoku. _________________ Mám strach |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 30. červenec 2008, 09:01:28 Předmět: |
|
|
no je tam nativni trida hkVector4, ktera ve vjetsine funkci ocekava taky hkVector4 ale primo objekt a ne pointer. Pokousel sem se to udelat takhle:
kód: |
void Vector4::Add4(Vector4 a)
{
pin_ptr<Vector4> pinnedThis = this;
((hkVector4*)pinnedThis)->add4((hkVector4)a);
} |
ale takhle to nejde s tim pointerem je to OK, ale ten parametr nejde.... |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 30. červenec 2008, 09:55:15 Předmět: |
|
|
Nemělo by to vypadat spíš nějak takto:
kód: |
public ref class Vector4 {
private:
hkVector4 havokVector;
public:
void Add4(Vector4 ^other) {
this->havokVector.add(other->havokVector);
}
}
|
Neboli .NETové třídy zabalí ty nativní. _________________ Mám strach |
|
Návrat nahoru |
|
|
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 30. červenec 2008, 10:06:06 Předmět: |
|
|
V C++ nedelam a ani v C++/CLI.
Pokud je Vector4 taky nativni trida, tak ti asi neporadim. Pokud vsak Vector4 je managed trida, tak to takhle nepujde. Native a managed veci jsou v pameti ulozeny naprosto jinym zpusobem, takze pretypovani nestaci (takze by nemelo fungovat ani pretypovat pinnedThis na pointer na hkVector4). Managed trida se musi nejpre marshalovat, cimz se do pameti zkopiruje jako nativni trida (afaik)... nejaky clanek o tomhle http://gregs-blog.com/category/ccli/
Navic, mozna se s tim trapis zbytecne - http://sourceforge.net/projects/xnahavok
(V mem postu muze byt hodne faktickych chyb ... nejdulezitejsi z nej je keyword marshaling ) |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 30. červenec 2008, 10:10:14 Předmět: |
|
|
Quiark napsal: |
Neboli .NETové třídy zabalí ty nativní. |
Jo, přesně tak. Asi dvakrát jsem mu to říkal na ICQ... |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 30. červenec 2008, 10:13:36 Předmět: |
|
|
No jedna moznost je pinovat pointer (podle prikladu vyse). To ti zajisti, ze dostanes void* primo na data v pameti, muzes je cist/zapisovat. Dale tim rikas garbage collectoru, aby data nepresunul a neodalokoval.
Druha moznost je si vzit GCHandle. Tim ziskas "referenci" na maneged objekt, kterou si muzes drzet v nativnim kodu. GC ti objekt neuvolni (da se to ruzne nastavit, zde vetsinou dovolis, aby se objekt mohl v pameti presouvat). Pozdeji muzes handle prevest zase zpatky na managed objekt a handle pripadne uvolnit. Vice viz msdn library. _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 30. červenec 2008, 10:22:46 Předmět: |
|
|
Augi + Quiak:
Ja to tak u ostatnich trid mam/delam, jen sem chtel zjistit, jestli to nejde jinak protoze pouzivat referencni typ na Vector s tim ze pokud vim bych ho pak musel rucne uvolnit pres Dispose (pokud to neni jinak). Tak mne to neprijde jako nejlepsi reseni.
Posila: na to jsem se uz dival, vypada to jako opravdu urceny pro XNA, je to uz docela omezeny, ja to chci co nejbliz puvodnimu rozhrani...
I kdyby to bylo pak k nicemu, alespon se neco naucim... |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 30. červenec 2008, 11:11:12 Předmět: |
|
|
Tak se ještě zeptam na jednu věc když to udělám jak píše Quiak, tak se ta nativní třída odstraní zároveň s tou řízenou ok?
Edit: Tak sem to zkusil, to jak to pise Quiak taky neprojde "Mixed type isn't supported" |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 30. červenec 2008, 15:04:43 Předmět: |
|
|
Tak sem to vyřešil ještě jedním nativním structem ve kterym je přímo objekt, a řízená třída si drží odkaz na tu strukturu...
Teďka ještě kde tu strukturu potom uvolnit? |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 8. srpen 2008, 21:13:23 Předmět: |
|
|
Tak tohle vsechno uz sem nejak poresil. Ale vyvstal mi dalsi problem. Nenapada nekoho jak nejlip obalit hierarchie trid? jasne muzu vzit jednu tridu z hierarchie a tu obalit, ale premyslel jsem jestli by neslo nejak pouzit i dedeni mezi tema rizenyma tridama? |
|
Návrat nahoru |
|
|
|