I am exploring using P/Invoke to call some legacy code from our customer
contact software. I have been trying some simple test scenarios and haven't
had success. Can someone point me to an example that shows how this can be
done? Here is a snippet of code I am trying:
Header file of C++ class for web service:
[DllImport("kernel32.dll", SetLastError=true)]
extern "C" bool GetComputerName(String *name, int *len);
Class file for web service:
String __gc* callKAPIClass::HelloWorld()
{
String *p = "1234567890123456789012345678901234567890";
int len = 30;
bool rc = true;
rc = GetComputerName(p, &len);
int rc2 = Marshal::GetLastWin32Error();
return p;
}
Unfortunately, I always get an error in GetComputerName().
Mark
Carl Daniel [VC++ MVP] - 16 Jun 2005 20:31 GMT
> I am exploring using P/Invoke to call some legacy code from our
> customer contact software. I have been trying some simple test
[quoted text clipped - 22 lines]
>
> Unfortunately, I always get an error in GetComputerName().
Not surprising, since GetComputerName doesn't have any idea what to do with
a String*.
My suggestion would be to not use PInvoke. Rather, just call the function
from your C++ code and rely on IJW to bridge the managed/unmanaged gap.
<untested code>
#include <windows.h>
String __gc* callKAPIClass::HelloWorld()
{
char sz[MAX_COMPUTERNAME_LENGTH + 1];
int len = sizeof(sz);
bool rc = true;
rc = GetComputerName(sz, &len);
int rc2 = Marshal::GetLastWin32Error();
return Marshal.PtrToStringAuto(static_cast<IntPtr>(sz),len);
}
</untested code>
-cd