Managed C++ & P/Invoke in a web serice


G

Guest

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
 
Ad

Advertisements

C

Carl Daniel [VC++ MVP]

MarkOwen said:
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().

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top