[ Shadowed @ 28.07.2007. 22:42 ] @
Nije bas najsrecniji naslov...

O cemu se radi.. Cesto neke aplikacije imaju podrsku za plugin-ove. To je obicno realizovano tako sto onaj ko pravi plug-in napravi .dll sa C++ funkcijama (slicnim kao Win32 API) koje onda glavna aplikacija poziva.
E sad, posto ja C++ bas i ne znam nesto narocito dobro i posto sada C++ moze da koristi .NET potrebna mi je sledeca stvar - "klasican" dll koji ce imati neku fuknkciju koja ce, kada je aplikacija pozove, da pozove funkciju iz .net dll-a (class library) koji bih ja napravio.
Znaci, ako bi neko napisao samo taj poziv u c++u i okacio project uz poruku pa bih ja to na dalje koristio kao sablon (dodavao na isti nacin funkcije, menjao ime i parametre itd) bio bih zahvalan :)

Nadam se da sam uspeo da napisem dovoljno razumljivo
[ prog @ 28.07.2007. 23:39 ] @
http://www.pinvoke.net/
[ Shadowed @ 29.07.2007. 00:18 ] @
Nije to to. Tu su date deklaracije za pozivanje Win32 API-a iz .net aplikacije.
Meni treba pozivanje .net funkcije (odnosno metoda neke klase) iz C++ projekta.
[ Pharos @ 29.07.2007. 00:20 ] @
ANSI c++ ili ovaj C++ iz .NET?
Ne razumemo te :)
Recimo pišeš .dll u c# i hoćeš to u Managed c++, jel to?
Ako je tako:

Napravio sam jedan .dll u C#
Code:

using System;
using System.Collections.Generic;
using System.Text;

namespace Sabiranje
{
   public class Sabiranje
   {
       public static int Saberi(int x, int y)
       {
           return x + y;
       }
   }
}

Napravio novi c++ win forms projekat.
Ides na project > References... > Add new reference... > Browse...
I tamo prođeš .dll koji te zanima.
Postaviš jedno dugme na formu
I napišeš sledeći kod u click eventu:
Code:

int y = Sabiranje::Sabiranje::Saberi(5,6);
MessageBox::Show(y.ToString());


Ako nije, pojasni :)
[ Shadowed @ 29.07.2007. 01:10 ] @
E to :)

Samo, da taj projekat u C++ ne bude GUI aplikacija, nego .dll sa obicnim funkcijama.
Znaci ovo:
Code:
int y = Sabiranje::Sabiranje::Saberi(5,6);
MessageBox::Show(y.ToString());


Se ne poziva klikom na taster, vec pozivom exportovane (ili kako se zove) funkcije.

Znaci (u slucaju plugin-a): Winamp --> C++.dll saberi(2, 4) --> C#/VB .dll saberi(2, 4)

[Ovu poruku je menjao Shadowed dana 29.07.2007. u 10:40 GMT+1]
[ MarkoBalkan @ 29.07.2007. 08:57 ] @
kreiras class library u .net-u za C# jezik.

ja sam radio racun za kvadratnu jednadzbu.

ubacis u projekt i zoves samo varijable.
[ Pharos @ 30.07.2007. 00:14 ] @
Čoveka zapravo zanima kako napraviti .DLL u C++ koji ima referencu na neki drugi (externi) .DLL i kako da pozove metode iz externog .DLL-a u svom .DLL-u.
Možda bi bilo najbolje da ovo premestiš u c++ forum jer pitanje nema toliko veze sa .NET i buni ljude.
[ Shadowed @ 30.07.2007. 00:49 ] @
Da, upravo to.

Ostavicu jos par dana, pa ako ne bude resenja prebacicu u C++ forum.
[ dusty @ 30.07.2007. 09:00 ] @
Kakav DLL si imao na umu, MFC ili Win32, ili ti je samo bitno da calling convention funkcija ima C++ dekoraciju ?
[ Shadowed @ 30.07.2007. 10:47 ] @
Win32, kao sto su API funkcije (SetWindowPos npr.). Ovo sa C++ dekoracijom ne razumem, verovatno jer nemam pojma C++ :)
[ dusty @ 30.07.2007. 14:18 ] @
Tja, prekopao sam po disku, ali mi je izgleda ta aplikacija kod kuce na bekapu.

Davno sam to radio, ali uglavnom, managed dll koji ce da korsiti Win32 dll treba da bude registrovani COM objekat, sto je, je'l te logicno jer je sam CLI baziran na COM-u
Napravis u managed dll-u interfejs za tvoj tip (nisam siguran da li mora da se dodaju IUnknown i IDispatch interfejsi ili to sam kompajler ubaci) i registrujes ga preko RegAsm. RegAsm izgenerise type library (tlb) koji uvezes najobicnije sa #import "MyDLL.tlb" using MyDLLNamespace, inicijalizujes COM (CoInitializeEx(NULL)) i deklarises pointer na interfejs tvoga tipa i kreiras instancu preko CoCreateInstance. Pristupanje promenljivama je moguce samo preko accessora-a, koje ce kompajer (ako se ne varam) da pretvori u dve metode sa prefiksom set_* , odnosno get_*.

Koliko se secam, ne mogu se praviti smart pointeri nad tvojim tipom (bese tu neka cela zavrzlama), pa moras da pazis da ih deinicijalizujes sa Release() kada zavrsis sa njima.

Nasao sam nesto .... might help ....
http://support.microsoft.com/kb/828736
http://msdn2.microsoft.com/en-us/library/zsfww439(vs.71).aspx

[Ovu poruku je menjao dusty dana 30.07.2007. u 16:58 GMT+1]