Re: How would you marshal this?



You are quite right. The "public string Name" is not correctly marshalled to
"char* Name". I get a Bad pointer when I debug the native code. But adding
[MarshalAs(UnmanagedType.LPStr)] doesn't seem to help. Any ideas?

/Chris

"Markus Eßmayr" <essmayr/at/racon-linz.at> wrote in message
news:uMznbftcHHA.5044@xxxxxxxxxxxxxxxxxxxxxxx
Hi,

I didn't have a closer look, but you may want to try

[MarshalAs(UnmanagedType.LPStr)]

added to the member of type char*

Max


"Christoffer" <christoffer@xxxxxxxxxx> schrieb im Newsbeitrag
news:%2383GvcgcHHA.4632@xxxxxxxxxxxxxxxxxxxxxxx
I'm trying to marshal these structs but I keep getting an access
violation...

typedef struct
{
BYTE Line;
BYTE Pr;
char * Name;
tEXTERNAL_NUMERIC Quantity;
char Vat;
tEXTERNAL_NUMERIC Price;
tEXTERNAL_NUMERIC Gross;
tEXTERNAL_NUMERIC Discount;
} tFUNC_PARAMS;

typedef struct
{
tTRANSL_FUNC TranslFuncPtr;
LPVOID ValuePtr;
} tEXTERNAL_NUMERIC;

typedef int ( *tTRANSL_FUNC )( LPVOID, char * );

I tried to Marshal it as

[StructLayout(LayoutKind.Sequential, Pack = 0)]
internal struct tFUNC_PARAMS
{
public byte Line;
public byte Pr;
public string Name;
public tEXTERNAL_NUMERIC Quantity;
public char Vat;
public tEXTERNAL_NUMERIC Price;
public tEXTERNAL_NUMERIC Gross;
public tEXTERNAL_NUMERIC Discount;
}

[StructLayout(LayoutKind.Sequential, Pack = 0)]
internal struct tEXTERNAL_NUMERIC
{
[MarshalAs(UnmanagedType.FunctionPtr)]
public tTRANSL_FUNC TranslFuncPtr;
public IntPtr ValuePtr;
}

internal delegate int tTRANSL_FUNC(IntPtr o, string s);

I'm trying the following code:

byte line = 1;
string name = "kaka";
string quantity = "10";
char vat = 'A';
string price = "10";
string gross = "10";
byte pr = 2;
string discount = null;

tFUNC_PARAMS addParams = new tFUNC_PARAMS();
addParams.Line = line;
addParams.Pr = pr;
addParams.Name = name;

IntPtr quantityPtr = IntPtr.Zero;
IntPtr pricePtr = IntPtr.Zero;
IntPtr grossPtr = IntPtr.Zero;
IntPtr discountPtr = IntPtr.Zero;

quantityPtr = Marshal.StringToHGlobalAuto(quantity);
addParams.Quantity.ValuePtr = quantityPtr;
addParams.Quantity.TranslFuncPtr = null;

addParams.Vat = vat;

pricePtr = Marshal.StringToHGlobalAuto(price);
addParams.Price.ValuePtr = pricePtr;
addParams.Price.TranslFuncPtr = null;

grossPtr = Marshal.StringToHGlobalAuto(gross);
addParams.Gross.ValuePtr = grossPtr;
addParams.Gross.TranslFuncPtr = null;

if (!String.IsNullOrEmpty(discount))
{
discountPtr = Marshal.StringToHGlobalAuto(discount);
}
addParams.Discount.ValuePtr = discountPtr;
addParams.Discount.TranslFuncPtr = null;

NativeMethods.Func(ref addParams); // int Func( tFUNC_PARAMS *paramsPtr )


Where have I gone wrong?

Cheers,
Chris





.



Relevant Pages


Loading