views:

3538

answers:

1

I have a C++ DLL returning an int* to a C# program. The problem is the int* in C# remains null after the assignment.

When I assign the C++ result to an IntPtr, I get a correct non-null value. However any attempt to convert this to an int* results in null.

I've tried:

IntPtr intp = cppFunction ();           // Non-null.

int* pi = (int *) intp;                 // Results in null.

int* pi = (int *) intp.ToPointer ();    // Results in null.


void* vp = intp.ToPointer ();

int* pi = (int *) vp;                   // Results in null, but vp is non-null.

How can I get a non-null int* ?

Thanks! Alan

+3  A: 

You cppFunction declaration should be something like:

void cppFunction(ref int* ptr) {
   ptr = somevalue;
}

That should solve your problem.

You may find this useful also: http://www.pcreview.co.uk/forums/thread-2902012.php

James Black
Thanks James. I tried your method like this: [DllImport("vdrdll.dll", EntryPoint = @"?getLineContentsAsArg@@YAXAAPAH@Z")] public unsafe static extern void getLineContentsAsArg (ref int* lca); DLLEXPORT void getLineContentsAsArg (int*}A pointer value is assigned in the DLL, but when it gets back to C#, it's null.I looked at your examples, and only the last one attempts to assign to a pointer variable in C#. Every time I've tried this, the result of the assignement is null.Can you see anything I'm doing wrong?Thanks!
I will need to look at it more when I finish mowing, but, I realized that recently the way I solved this was that in C# I allocated a buffer, sent the pointer to the unmanaged code, along with an IntPtr to get the length. The problem you are encountering is probably due to the fact you are expecting the C++ function to do the malloc and return the string. In that case you probably need to pass a pointer to the pointer, but I am not certain how you would free that in C# when you are done with it.
James Black