I've a C# DLL below like. I want to use this C# DLL in C++ Builder.
But I don't know C# Struct and C++ Struct marshalling:
using RGiesecke.DllExport; using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; namespace TestLibrary { [ComVisible(true)] [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct MyStruct { public int X; public int Y; } public class Class1 { [DllExport("DoSomething", CallingConvention = CallingConvention.StdCall)] public static int DoSomething(int x, int y, ref MyStruct myStruct) { myStruct.X = 50; myStruct.Y = 75; return x + y; } } } I want to pass "myStruct" parameter from C++ Builder below like.
void __fastcall TForm1::FormCreate(TObject *Sender) { struct MyStruct { int X; int Y; }; int (__stdcall *DoSomething)(int,int,MyStruct); HINSTANCE dllHandle = NULL; dllHandle = LoadLibrary( edtdllPath->Text.c_str()); if(dllHandle == NULL) return; int status = -1; try { DoSomething =(int (__stdcall *)(int,int,MyStruct)) GetProcAddress(dllHandle, "DoSomething"); } catch(Exception &Err) { ShowMessage(Err.Message); } if(DoSomething != NULL) { try { MyStruct myStruct; status = DoSomething(5,5,myStruct); String strStatus = status; ShowMessage(strStatus); ShowMessage(myStruct.X); ShowMessage(myStruct.Y); } catch(EAccessViolation &err) { ShowMessage(err.Message); } } } When I debug code,myStruct.X and myStruct.Y value is wrong.
Where is my wrong ?
ref StringBuilder, and I don't think you can useStringBuilder. By far the easiest solution is to useUnmanagedType.BStrand use the COMBStr. You do need to back up a little and understand the basics more than you currently do.