.[ ČeskéHry.cz ].
Tvorba wraperu C++ -> CLI

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET
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

PříspěvekZaslal: 10. červen 2008, 15:25:33    Předmět: Tvorba wraperu C++ -> CLI Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Yossarian



Založen: 28. 07. 2007
Příspěvky: 274
Bydliště: Šalingrad

PříspěvekZaslal: 10. červen 2008, 15:32:45    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 10. červen 2008, 15:38:20    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 10. červen 2008, 15:39:57    Předmět: Odpovědět s citátem

citace:
unmanaged c++?

No taky bych mohl myslet C++/CLR. Proto sem psal unmanaged, aby bylo jasny, ze myslim normalni C++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 29. červenec 2008, 16:33:09    Předmět: Odpovědět s citátem

Jde nejak dostat managed type do nativni funkce, ktera ocekava primo objekt a ne pointer? Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 29. červenec 2008, 21:25:02    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 30. červenec 2008, 09:01:28    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 30. červenec 2008, 09:55:15    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
posila



Založen: 29. 07. 2007
Příspěvky: 201

PříspěvekZaslal: 30. červenec 2008, 10:06:06    Předmět: Odpovědět s citátem

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 Wink)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 30. červenec 2008, 10:10:14    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 30. červenec 2008, 10:13:36    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 30. červenec 2008, 10:22:46    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 30. červenec 2008, 11:11:12    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 30. červenec 2008, 15:04:43    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Deluxe



Založen: 31. 07. 2007
Příspěvky: 235
Bydliště: Oslavany

PříspěvekZaslal: 8. srpen 2008, 21:13:23    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna