Re: Another C# marshaling question

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



Laurent,

You are going to have to manually marshal the structure. Your structure
declaration needs to be changed:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public class FF_Struct
{
public int index;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = FF_ID_LEN)]
public string numeroCommande;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = FF_DATETIME_LEN)]
public string dateCommande;
}

Declaring as a class will tell the CLR that it can re-arrange the order
of the fields as it wishes, which is not what you want in this case.

You will also have to change your function declaration to:

[DllImport("FF_myDLL.dll")]
public static extern int FF_Function(
IntPtr inInstance,
[MarshalAs(UnmanagedType.LPTStr)]
string date,
ref IntPtr outStructure,
ref int outNumber
);

Then, what you have to do on return is marshal the array, like so:

// Allocate the array.
FF_Struct[] outStructs = new FF_Struct[outNumber];

// Cycle through unmanaged memory, and marshal.
for (int index = 0; index < outNumber; index++)
{
// Get the pointer of the location in memory.
IntPtr elementPointer = new IntPtr(outStructure.ToInt64() + (index *
Marshal.SizeOf(typeof(FF_Struct))));

// Now marshal that value.
outStructs[index] = Marshal.PtrToStructure(elementPointer,
typeof(FF_Struct));
}

The only problem here is that you have to figure out how to release the
memory that was allocated for the structure. The function is allocating it,
but you aren't handling that in this situation.

Hope this helps.


--
- Nicholas Paldino [.NET/C# MVP]
- mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx


"Laurent" <mournblade@xxxxxxx> wrote in message
news:u210%23zD9FHA.1484@xxxxxxxxxxxxxxxxxxxxxxx
> Hi again,
>
>
>
> I created a thread some days ago, while I was trying to access a C++
> DLL using my C# program. First of all, I want to thanks all the guys who
> helped me. But I still have a problem... My C++ DLL has a function which
> has the following prototype:
>
> long FF_Function(void* inInstance, char* inDate, FF_Struct**
> outStructure, long* outNumber);
>
> The structure has the following prototype:
>
> struct FF_Struct
> {
> long m_Index;
> char m_ID[FF_ID_LEN];
> char m_Date[FF_DATETIME_LEN];
> };
>
>
> I know that the function should return me an array of FF_Struct, and
> that the parameter outNumber has the number of elements stored in the
> FF_Struct array. Now, I'm tring to translate it in C#, and here is what I
> did (which does not work, of course):
>
>
> public class FF_AO_OrderList
> {
> public int index;
> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = FF_ID_LEN)]
> public string numeroCommande;
> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = FF_DATETIME_LEN)]
> public string dateCommande;
> }
>
>
> [DllImport("FF_myDLL.dll")]
> public static extern int FF_Function
> (
> IntPtr inInstance,
> [MarshalAs(UnmanagedType.LPTStr)]
> string date,
> out FF_Struct[] outStructure,
> out int outNumber
> );
>
>
> I can access the function, but it returns me an error message ("The
> parameters specified for the interface are incorrect."). I don't know how
> to deal with this structure and its double pointer. Even in unsafe mode
> (then I use a FF_Struct** parameter), I have the same problem.
>
>
> Does anyone knows what I'm missing ? I'd greatly appreciate some help,
> as I'm completely out of ideas... Thanks !!!!
>
>
>
> Laurent
>


.



Relevant Pages

  • why cant array forward declarations be static?
    ... An array can be declared and used without the size being known, ... int get_foo ... The full definition can also come later in the same source file: ... that the forward declaration with static is perfectly reasonable although ...
    (comp.lang.c.moderated)
  • Re: Finding a perfect number.
    ... That's really an algorithm question, ... several numbers you expect to use to populate the array in step 3. ... int number, i, split, total; ... declaration of arrays with a length which is dynamically determined. ...
    (comp.lang.c)
  • Re: Implicit int
    ... compile or implement, or even would have been in the 1970s. ... note that if you can't declare an array of size "n", ... could not already do with long int, had they chosen so to do. ... I recognise that this is not a popular view, but if the declaration is ...
    (comp.std.c)
  • Re: More proof of errors going uncorrected among the "regs"
    ... of a declaration of an object with incomplete type. ... I've worked with code that had an array declared like that. ... unit containing `int array;' at file scope and with no ...
    (comp.lang.c)
  • Re: Struts tag <logic:iterate>
    ... > and class B also contains array of some class ... > int j; ... > public class TestBean { ... > I try to iterate each element of arrayC, ...
    (comp.lang.java.programmer)