🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
6 messages
6 total messages Started by Krzysztof Thu, 04 Dec 2003 17:41
DLL trzecie podejscie frustrata
#285
Author: Krzysztof
Date: Thu, 04 Dec 2003 17:41
18 lines
1557 bytes
mam urawnie glowy z tym bardzieiwm

mam napisac DLL (.Net) ktora ma wykorzystywac standardowa (czytaj badziewna
i stara) DLL (napisana w C++6 )

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)
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....

a pardon jest jeszcze 3: walnac to wszystko i na piwo...

jakies sugestie? propozycje?

Pozdrawiam
Krzysztof
Re: DLL trzecie podejscie frustrata - update
#286
Author: Krzysztof
Date: Thu, 04 Dec 2003 18:28
37 lines
1912 bytes
[ciach all bo moje :) ]

hm, konkretny przyklad z marshalingiem po czytaniu instrukcji (kochane F1) i
konsultacjach:
kod C++:
typedef (__stdcall *EncryptPassword)(           const string& input,
string& output );

jak widac zwykla deklaracja metody, dwa parametry, z czego drugi zwrotny...
zask w kodzie C#:

[DllImport("MyApi.dll")]
public static extern void EncryptPassword( IntPtr input, IntPtr output);

String user = "jakis_user";
String wynik = "jakis_lamersko_bardzo_dlugi_string_co_ma_256_znakow";
p1 = Marshal.StringToHGlobalAuto( user );
p2 = Marshal.StringToHGlobalAuto( wynik );

try
{
EncryptPassword( p1, p2);
}
catch (Exception e)
{
Console.Out.WriteLine( "" + e.ToString() );
}

a traz zgadnijcie jaki rzuca blad? Zgadliscie :)
"Odwo�anie do obiektu nie zosta�o ustawione na wyst�pienie obiektu."

Czyli nie przekazano , albo nie odebrano, z biznesowego punktu widzenia -
nie dziala.

Moze teraz jakies sugestie?
Pozdrawiam
Krzysztof
Re: DLL trzecie podejscie frustrata
#287
Author: 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
Re: DLL trzecie podejscie frustrata
#288
Author: Selvin
Date: Fri, 05 Dec 2003 09:03
11 lines
1314 bytes
<ciach>
> char* lpsz1 = (char*)(void*)Marshal::StringToHGlobalAnsi(input);
> string s1(lpsz1);
> Marshal::FreeHGlobal(lpsz1);

hmm to bylo wlasnie na linku ktory podalem w "poprzednim podejsciu"
chyba nikomu sie nie chcialo nawet tam spojrzec

pozdrawiam

Przemek sulikowski
Re: DLL trzecie podejscie frustrata
#289
Author: Pawel Zabza
Date: Fri, 05 Dec 2003 10:09
10 lines
1409 bytes
Selvin wrote:
[...]
> hmm to bylo wlasnie na linku ktory podalem w "poprzednim podejsciu"
> chyba nikomu sie nie chcialo nawet tam spojrzec

Kolega widze niedowartosciowany.  Najmocniej przepraszam za swoj 
poprzedni post, zaraz puszcze cancela.

Pozdrawiam,
Pawel
Re: DLL trzecie podejscie frustrata
#290
Author: Selvin
Date: Fri, 05 Dec 2003 10:22
7 lines
1269 bytes
> Kolega widze niedowartosciowany.  Najmocniej przepraszam za swoj
> poprzedni post, zaraz puszcze cancela.
:)

pozdrawiam

Przemek Sulikowski
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads