Article View: alt.pl.comp.lang.csharp
Article #287Re: DLL trzecie podejscie frustrata
From: Pawel Zabza
Date: Fri, 05 Dec 2003 08:04
Date: Fri, 05 Dec 2003 08:04
68 lines
3376 bytes
3376 bytes
Krzysztof wrote:
> mam napisac DLL (.Net) ktora ma wykorzystywac standardowa (czytaj badziewna
> i stara) DLL (napisana w C++6 )
Hmmm...
> juz wiem mniej wiecej ze musze pokombinowac z marshalingiem klas przy
> przekazywaniu wartosci. I wlasciwie sa dwie mozliwosci:
> 1. tworzyc klasy i rzutowac je na TCHAR (czy tez inne badziewia) i
> zstanawiac sie kiedy padnie (zakresy, panie, zakresy to mi z reki jadly)
Oj =)))).
> 2. napisac wraper w managemend C++ konwertujacy typy (moze to komus zlecic
> :) ) a potem standardowa DLL w C#, tylko ze ja przy C++ nawet nie stalem....
Im dokladniej czytam tym mniej rozumiem, ale mniejsza o to. Jak juz
wczesniej pisalem w C# nie da sie napisac DLLa eksportujacego funkcje,
jesli to masz na mysli piszac "standardowy DLL".
Wrapper w managed C++ jest raczej prosty. Dla funkcji ktora podales w
poscie ponizej mozna napisac cos w rodzaju:
// C++
[DllImport("xyz.dll")]
void EncryptPassword(const string&, string&);
.....
void EP(String* input, String** output)
{
string s2("");
// basic_string from String
char* lpsz1 = (char*)(void*)Marshal::StringToHGlobalAnsi(input);
string s1(lpsz1);
Marshal::FreeHGlobal(lpsz1);
// function call
EncryptPassword(s1, s2);
// String from basic_string
*output = new String(s2.c_str());
}
Moglem zrobic jakas literowke, nie probowalem tego kompilowac.
Oczywiscie funkcja EP musi byc jakos dostepna dla klienta, np.
eksportowana, choc tu prosciej gdyby byla statyczna w klasie.
Poniewaz STLowe stringi sa przekazywane miedzy DLLami, istotne jest zeby
oba (czyli ten istniejacy w VC++6 i ten nowy, managed) uzywaly tego
samego CRT, linkowanego dynamicznie zreszta. Ten kto pisal te
istniejaca biblioteke mam nadzieje o tym wiedzial, ale chyba ten program
ktory piszesz nie jest jedynym klientem.
Majac taki wrapper, w C# uzywasz go zaleznie od tego jak funkcje zostala
zdefiniowane, ale parametry masz juz jako String.
Uzycie IntPtr jak proponujesz w poscie ponizej jest bezcelowe, bo
problem nie w tym jak zdobyc wskaznik tylko co jest po jego "drugiej
stronie". CLR nie wie co to jest std::string, w przeciwnym razie
standardowy marshaller CLR wiedzialby zapewne co z nim zrobic (inaczej
bylby do ... niczego).
Pozdrawiam,
Pawel
Technical Details
Message-ID:
<bqpe5q$aso$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!uio.no!newsfeed.kolumbus.fi!fi.sn.net!newsfeed2.fi.sn.net!news-stoc.telia.net!news-stoa.telia.net!telia.net!news.nask.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mailReferences:
<bqnrjv$nao$1@news.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!uio.no!newsfeed.kolumbus.fi!fi.sn.net!newsfeed2.fi.sn.net!news-stoc.telia.net!news-stoa.telia.net!telia.net!news.nask.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mail From: Pawel Zabza <pza...@poczta.onet.pl> Newsgroups: alt.pl.comp.lang.csharp Subject: Re: DLL trzecie podejscie frustrata Date: Fri, 05 Dec 2003 10:04:08 +0200 Organization: . Lines: 69 Sender: pzabza@poczta.onet.pl@cbl217-132-248-13.bb.netvision.net.il Message-ID: <bqpe5q$aso$1@news.onet.pl> References: <bqnrjv$nao$1@news.onet.pl> NNTP-Posting-Host: cbl217-132-248-13.bb.netvision.net.il Mime-Version: 1.0 X-Trace: news.onet.pl 1070611450 11160 217.132.248.13 (5 Dec 2003 08:04:10 GMT) X-Complaints-To: ab...@onet.pl NNTP-Posting-Date: 5 Dec 2003 08:04:10 GMT User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.5) Gecko/20031013 Thunderbird/0.3 X-Accept-Language: en-us, en In-Reply-To: <bqnrjv$nao$1@news.onet.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit