/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
C# og Borland C++ Builder
Fra : Rasmus


Dato : 24-07-04 22:08

Hej

Jeg bruger Borland C++ Builder og er prøver på at få en C# dll (kompilet med
MS Visual C#) og mit C++ program til at virke sammen.
C# dll'en indeholder funktionen testMethod() som returnerer et tal af typen
int.
Jeg prøver at linke dll'en dynamisk sådan:
dllhandle=LoadLibrary("ClassLibrary2.dll");
typedef int (__stdcall *TESTMETHOD)();
TESTMETHOD testMethod=(TESTMETHOD)::GetProcAddress(dllhandle, "testMethod");
Edit2->Text = IntToStr(testMethod());
Jeg får en Access violation error ved sidste linie.
Men så vidt jeg har læst mig til er det slet ikke muligt at gøre sådan,
korrekt?
Når jeg f.eks. bruger tdump, ser det ud som om dll'en slet ikke eksportere
nogen funktioner.
Det er vist noget med at man skal lave en såkaldt managed wrapper class?
Hvad er det, hvordan fungere det og hvordan laver man sådan en? Findes der
evt. en toturial om det?

På forhånd tak!

Mvh. Rasmus Steffensen



 
 
Per Thomsen (25-07-2004)
Kommentar
Fra : Per Thomsen


Dato : 25-07-04 19:13

Rasmus wrote:
> Hej
>
> Jeg bruger Borland C++ Builder og er prøver på at få en C# dll (kompilet med
> MS Visual C#) og mit C++ program til at virke sammen.
> C# dll'en indeholder funktionen testMethod() som returnerer et tal af typen
> int.
> Jeg prøver at linke dll'en dynamisk sådan:
> dllhandle=LoadLibrary("ClassLibrary2.dll");
[klip]

Hej Rasmus

En "C# dll" er formentlig en .NET assembly (dvs. managed code), og det
er ikke det samme som en "gammeldags" (unmanaged) dll. At de begge
hedder .dll er imho noget uheldigt. Du kan svjv ikke bruge en managed
assembly fra et unmanaged program, da den indeholder .NET byte-code
(groft sagt).


> Det er vist noget med at man skal lave en såkaldt managed wrapper class?

En managed wrapper class bruges til at importere unmanaged dll'er til
managed code, altså nærmest det modsatte af, hvad du ønsker.


> Hvad er det, hvordan fungere det og hvordan laver man sådan en? Findes der
> evt. en toturial om det?

Det er muligt at der findes et eller andet bibliotek, der gør det muligt
at bruge managed code fra unmanaged, men jeg kender ikke til det, og vil
umiddelbart også tro at det kræver at brugeren har .NET Frameworket
installeret.

Mht. at bruge unmanaged code fra managed, er jeg sikker på at google vil
være dig behjælpelig ;)

MVH Per Thomsen,
http://www.pert.dk/

Rasmus (27-07-2004)
Kommentar
Fra : Rasmus


Dato : 27-07-04 12:04

Hei

Tak for svaret!

Jeg har læst lidt mere på det, og det siges at det er nemmest at lave et COM
Inertop object i C# og så loade det ind i builderen?
Nu er det sådan at jeg ikke ved specielt meget om COM objecter.
Først C# koden:
interface IDotNetInterface
{
void Initialize();
string Caption
{
set;
}
void ShowDialog(string sText);
}
class DotNetClass : IDotNetInterface
{
// Need a public default constructor for COM Interop.
public DotNetClass()
{
}
public void Initialize()
{
m_sCaption = "";
}
public string Caption
{
set { m_sCaption = value; }
}
public void ShowDialog(string sText)
{
System.Windows.Forms.MessageBox.Show(sText, m_sCaption);
}
private string m_sCaption;
}

Efter at have compilet bruger jeg tlbexp til at lave et type library:
tlbexp ClassLibrary2.dll /out:ClassLibrary2.tlb
Tilsidst registrerer jeg objectet med RegAsm som følger med ms .Net
framework.
Meen, når jeg gør det får jeg en warning der lyder sådan: No types
registeret.
Vil det sige at der er noget galt i C# koden eller er det normalt?
Nå, efter den toturial jeg har fulgt gives der noget C++ kode til at hente
COM objectet ind:

#import "ClassLibrary2.tlb" raw_interfaces_only
//Allerede ved den første linie (givet af toturial'en) får jeg en fejl:
Unable to open include file ' ClassLibrary2.tlh'

//Det her kode står under click event til en knap.
CComPtr srpDotNet;

srpDotNet.CreateInstance(CLSID_DotNetClass, CLSCTX_ALL);

HRESULT hr = srpDotNet.Initialize();
if (SUCCEEDED(hr))
{
hr = srpDotNet.put_Caption(L"Client");
hr = srpDotNet.ShowDialog(L"Hello from the Client");
}

Første spørgsmål er, hvor går det galt, er C# koden korrekt?
Er C++ koden korrekt? Hvorfor får jeg fejl når jeg prøver at importere type
library'et?
Hvis jeg kikker i min project folder ligger der faktisk en ClassLibrary2.tlh
og .tli.

På forhånd tak!

Mvh. Rasmus Steffensen



Per Thomsen (28-07-2004)
Kommentar
Fra : Per Thomsen


Dato : 28-07-04 17:55

Rasmus wrote:
> Hei
>
> Tak for svaret!
>
> Jeg har læst lidt mere på det, og det siges at det er nemmest at lave et COM
> Inertop object i C# og så loade det ind i builderen?
[klip]

Øh... nu skal jeg vist lige have afklaret:

Den Borland C++ Builder, du bruger, er det en .NET tingeling?
(producerer den .NET kode?) (Jeg kender ikke særlig meget til Borland
C++ Builder).

Hvis den gør det, så har du ikke bruge for Interop, så skal du højst
sandsynligt bare tilføje C# assembly'en (eller en reference til den) til
dit projekt.
Det ved jeg desværre ikke hvordan man gør i Borland C++ Builder, men det
er der sikkert nogle andre der kan hjælpe med.

Hvis din Borland C++ Builder, ikke er en .NET tingeling, så må jeg vist
bare gentage mig selv: Den vej kan du ikke umiddelbart gå.

Interop bruges til at importere COM objekter til .NET programmer, _ikke_
til at importere .NET objekter til "almindelige" (unmanaged code)
programmer.

MVH Per Thomsen,
http://www.pert.dk/

Ivan Johansen (28-07-2004)
Kommentar
Fra : Ivan Johansen


Dato : 28-07-04 18:02

Per Thomsen wrote:
> Den Borland C++ Builder, du bruger, er det en .NET tingeling?
> (producerer den .NET kode?) (Jeg kender ikke særlig meget til Borland
> C++ Builder).

Ingen version af Borland C++ Builder understøtter .NET. Om det kommer
med i næste version eller om der overhovedet kommer en næste version
vides ikke.

Ivan Johansen

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste