🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: alt.pl.comp.lang.csharp
Article #287

Re: DLL trzecie podejscie frustrata

#287
From: Pawel Zabza
Date: Fri, 05 Dec 2003 08:04
68 lines
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-mail
References: <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