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;
}为什么返回的结果是乱码呢?

解决方案 »

  1.   

    GetIP的参数是BSTR, 用SysAllocString获取BSTR, 不要直接传char*
      

  2.   

    用 bstr_t 或 CComBSTR
      

  3.   

    *result = (unsigned short *)inet_ntoa(sAddr.sin_addr);
    改成
    _bstr_t bstr = (char*)inet_ntoa(sAddr.sin_addr);
    *result = bstr.Detach();
      

  4.   

    sAddr 是函数内部局部变量,返回后,释放了,需要用Detach等进行拷贝...
      

  5.   

    变量生命周期没理解好。
    用CComBSTR吧
      

  6.   

    如果你的COM组件是给C/C++程序用参数可以直接使用CHAR*
    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;