在C#中,
[DllImport(@"xxxxx.dll")]
private static extern string GetIP();
然后再调用,没有问题啊。很顺利。
"FrankJiao" <jia...@hotmail.com> wrote in message
news:559EABFE-F3F5-425F...@microsoft.com...
> 在VC环境下写了一个获取IPv6地址的类,并且已经得到所需要的值。
> 然后将对应的方法封装为一个DLL(C++),但在C#中调用DLL时出现返回值错误,
具体如下:
> 1、DLL中获取地址的函数返回值为char*,在C#中引用的时候改为StringBuilder(尝
试过string,但效果一样),调试结果在C#中得到是实际本机IPv6地址的一部分加上乱
码
> 2、尝试在DLL中不做任何处理直接用hard code返回IPv6的地址字符,返回结果正
常,即在C#中得到DLL中返回的地址字符
> 3、尝试在DLL中每次返回第一步中得到IPv6地址的单个字符,发现实际上每一个字符
都是正确的,而且这些单个字符组合起来就是本机IPv6地址
> 那位大侠有过关于在C#中调用DLL且返回字符串的经验(不一定必须要返回值为字符
串,但在C#中得到字符串),兄弟在这先谢过了,项目已经因为我延期了,在搞不定死
大了
C#中的调用跟你说的一样就不写了,DLL原型为:
extern "C"
{
char* GetIPAddr(int Family,int SocketType,char* Address,char* Port)
{
char AddrName[ 100];
//char* temp = "fe80::206:1bff:feca:46ce%4";
char* temp;
//return temp;
int RetVal;
BOOL RunForever = FALSE;
WSADATA wsaData;
ADDRINFO Hints, *AddrInfo, *AI;
if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
WSACleanup();
return "";
}
memset(&Hints, 0, sizeof(Hints));
Hints.ai_family = Family;
Hints.ai_socktype = SocketType;
Hints.ai_flags=AI_CANONNAME;
//解析主机/服务器获取其IP 地址
RetVal = getaddrinfo(Address,Port, &Hints, &AddrInfo);
if (RetVal != 0)
{
WSACleanup();
return "";
}
//将IP 地址转换成数字式字符文本
for (AI = AddrInfo; AI != NULL; AI = AI->ai_next)
{
if (getnameinfo(AI->ai_addr,
AI->ai_addrlen,
AddrName,
sizeof(AddrName), NULL, 0,
NI_NUMERICHOST) == 0)
{
break;
}
}
temp = AddrName;
WSACleanup();
//return AddrName;
return temp;
}
}
直接返回字符串是没有问题,但不知道为什么处理之后返回的值就有问题,但这段代码我在VC环境中使用的时候没有一点问题,大侠们帮我看看到底什么问题
“meteors”编写:
> 没有遇到过这种问题啊
> DLL中,
> extern "C"
> {
> .....
> .....