com组件的.cpp代码是
STDMETHODIMP CTrans::GetIP(BSTR garv, BSTR *result)
{
// TODO: Add your implementation code here
WSADATA wsaData;
HOSTENT *pHostEnt;
int nAdapter = 0;
struct sockaddr_in sAddr;
if (WSAStartup(0x0101, &wsaData))
{
printf("WSAStartup failed %s\n", WSAGetLastError());
return S_OK;
}
pHostEnt = gethostbyname((char*)garv);
while(pHostEnt->h_addr_list[nAdapter])
{
memcpy(&sAddr.sin_addr.s_addr, pHostEnt->h_addr_list[nAdapter],pHostEnt->h_length);
// 输出IP地址
printf("Name: %s\nAddress: %s\n", pHostEnt->h_name, inet_ntoa(sAddr.sin_addr));
nAdapter++;
}
WSACleanup();
*result = (unsigned short *)inet_ntoa(sAddr.sin_addr); return S_OK;
}
VC调用com组件的函数是
int main()
{
ITrans* pIT = NULL;
//BOOL result = false;
char result[100];
HRESULT hr = ::CoInitialize(NULL);
if (FAILED(hr))
{
return -1;
}
hr=::CoCreateInstance(CLSID_Trans,NULL,CLSCTX_INPROC_SERVER,IID_ITrans,(void**)&pIT);
if (FAILED(hr))
{
return -1;
}
char Hostname[100]="www.xiaonei.com";
hr = pIT->GetIP((unsigned short *)Hostname,(unsigned short **)result);
printf("%s\n",result);
return 1;
}为什么返回的结果是乱码呢?
STDMETHODIMP CTrans::GetIP(BSTR garv, BSTR *result)
{
// TODO: Add your implementation code here
WSADATA wsaData;
HOSTENT *pHostEnt;
int nAdapter = 0;
struct sockaddr_in sAddr;
if (WSAStartup(0x0101, &wsaData))
{
printf("WSAStartup failed %s\n", WSAGetLastError());
return S_OK;
}
pHostEnt = gethostbyname((char*)garv);
while(pHostEnt->h_addr_list[nAdapter])
{
memcpy(&sAddr.sin_addr.s_addr, pHostEnt->h_addr_list[nAdapter],pHostEnt->h_length);
// 输出IP地址
printf("Name: %s\nAddress: %s\n", pHostEnt->h_name, inet_ntoa(sAddr.sin_addr));
nAdapter++;
}
WSACleanup();
*result = (unsigned short *)inet_ntoa(sAddr.sin_addr); return S_OK;
}
VC调用com组件的函数是
int main()
{
ITrans* pIT = NULL;
//BOOL result = false;
char result[100];
HRESULT hr = ::CoInitialize(NULL);
if (FAILED(hr))
{
return -1;
}
hr=::CoCreateInstance(CLSID_Trans,NULL,CLSCTX_INPROC_SERVER,IID_ITrans,(void**)&pIT);
if (FAILED(hr))
{
return -1;
}
char Hostname[100]="www.xiaonei.com";
hr = pIT->GetIP((unsigned short *)Hostname,(unsigned short **)result);
printf("%s\n",result);
return 1;
}为什么返回的结果是乱码呢?
解决方案 »
- 自定义的停靠栏窗口在关闭的时候会报错
- 请教:如果判断某个窗口是否为可输入字符的?或者能否使用输入法呢?
- 怎么删除CString定义的变量
- 主对话框怎么让无模式子对话框显示内容
- ◎高手进来看看◎《关于UNICODE多线程程序中ZeroMemory导致new失败的问题》
- 为什么下载后的电子书所有页的扩展名都是A01~A03...101,102,103...?
- 怎样用ODBC同时连接两个数据库以实现双数据库查询,急急急急(我我要做毕业论文的)
- 方案,vc作一个播放声音和位图的程序时,有关技术对比选择问题
- 我有一套 VS.NET 7cd 。可是安装不上,少文件。但是我发现少的文件在cd2 ,cd3 ,cd4上可以找到,这是这么回事?
- 有关QueryInterface找不到另一个接口
- 高手请进,关于RegisterMimeFilter 等问题
- shcokwave loadmovie的问题
改成
_bstr_t bstr = (char*)inet_ntoa(sAddr.sin_addr);
*result = bstr.Detach();
用CComBSTR吧
STDMETHODIMP CTrans::GetIP(CHAR* garv, CHAR **result)
如果是其他语言的话就得使用BSTR,具体在代码里可以使用_bstr_t。
STDMETHODIMP CTrans::GetIP(BSTR garv, BSTR *result)
{
// TODO: Add your implementation code here
WSADATA wsaData;
HOSTENT *pHostEnt;
int nAdapter = 0;
struct sockaddr_in sAddr; if (WSAStartup(0x0101, &wsaData))
{
printf("WSAStartup failed %s\n", WSAGetLastError());
return S_OK;
} // 参数要转换
_bstr_t bstrgarv = garv;
pHostEnt = gethostbyname(bstrgarv); while(pHostEnt->h_addr_list[nAdapter])
{ memcpy(&sAddr.sin_addr.s_addr, pHostEnt->h_addr_list[nAdapter],pHostEnt->h_length); // 输出IP地址
printf("Name: %s\nAddress: %s\n", pHostEnt->h_name, inet_ntoa(sAddr.sin_addr)); nAdapter++;
}
WSACleanup(); // 返回值要转换
_bstr_t bstrResult = inet_ntoa(sAddr.sin_addr); *result = bstrResult.Detach();
return S_OK;
}
//VC调用com组件的函数是
int main()
{
ITrans* pIT = NULL;
//BOOL result = false;
//char result[100];
HRESULT hr = ::CoInitialize(NULL);
if (FAILED(hr))
{
return -1;
}
hr=::CoCreateInstance(CLSID_Trans,NULL,CLSCTX_INPROC_SERVER,IID_ITrans,(void**)&pIT);
if (FAILED(hr))
{
return -1;
}
//char Hostname[100]="www.xiaonei.com";
_bstr_t bstrHostname = "www.xiaonei.com";
_bstr_t bstrResult;
hr = pIT->GetIP(bstrHostname, bstrResult.GetAddress()); printf("%s\n", (char*)result); return 1;
}