OLECHAR* wcsConnection = NULL; 
hr = pIDataInitialize->GetInitializationString(pIDBProperties,true,&wcsConnection);请教是否需要释放wcsConnection

解决方案 »

  1.   

    delete wcsConnection ;
    行吗?
      

  2.   

    按COM规范,客户应该释放wcsConnection,用CoTaskMemFree
      

  3.   

    to  paul2002() :Msdn上GetInitializationString的参考中并没有说明要使用
    CoTaskMemFree方法来释放内存。根据我个人的经验,一些需要使用CoTaskMemFree来释放的MSDN上往往有显式的说明。
    比如 STATSTG 的说明中...
    Members
    pwcsName 
    Pointer to a NULL-terminated Unicode string containing the name. Space for this string is allocated by the method called and freed by the caller (see CoTaskMemFree). You can specify not to return this member by specifying the STATFLAG_NONAME value when you call a method that returns a STATSTG structure, except for calls to IEnumSTATSTG::Next, which provides no way to specify this value. ...
    如果不释放 wcsConnection 指向的内存,又不知这块内存何去何从。请大虾指点迷津,感激不尽!
      

  4.   

    那你试试看不释放有没有内存泄漏,如果没有,说明oledb provider自己会管理这块内存。
      

  5.   

    #include <MSDASC.H>
    #include <stdio.h>HRESULT GetDataSourceStringA(HWND,LPSTR,int)
    int main(int argc, char* argv[])
    {
    char sz[1024]={0};
    CoInitialize(NULL); if(SUCCEEDED(GetDataSourceStringA(NULL,sz,1024)))puts(sz);
    CoUninitialize();
    return 0;
    }
    HRESULT GetDataSourceStringA(HWND hWndParent,LPSTR lpDataSourceString,int cbString)
    { OLECHAR* wcsConnection = NULL; 
    HRESULT               hr                    = S_OK;
    IDBPromptInitialize* pIDBPromptInitialize   = NULL;
    IDBProperties* pIDBProperties   = NULL;
    IDataInitialize*     pIDataInitialize = NULL;  // Create a DataLinks object and get the IDBPromptInitialize interface of the object
    hr = CoCreateInstance(
    CLSID_DataLinks,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_IDBPromptInitialize,
    reinterpret_cast<void **>(&pIDBPromptInitialize));

    if(FAILED(hr))
    {
    goto RETURN_HANDLER;
    }
    hr = pIDBPromptInitialize->PromptDataSource(
    NULL,
    hWndParent,
    DBPROMPTOPTIONS_PROPERTYSHEET,
    0, NULL,
    NULL,
    IID_IDBProperties,
    reinterpret_cast<IUnknown **>(&pIDBProperties));
    if(FAILED(hr))
    {
    goto RETURN_HANDLER;
    }

    // Query IDataInitialize interface
    hr = pIDBPromptInitialize->QueryInterface(IID_IDataInitialize,(void**)&pIDataInitialize);
    if (FAILED(hr))
    {
    goto RETURN_HANDLER;
    } // call GetInitializationString method of IDataInitialize interface
    // to get the connection string
    hr = pIDataInitialize->GetInitializationString(pIDBProperties,true,&wcsConnection); if (FAILED(hr))
    {
    goto RETURN_HANDLER;
    }
    WideCharToMultiByte(CP_ACP,0,wcsConnection,-1,lpDataSourceString,cbString,NULL,NULL); CoTaskMemFree(wcsConnection);
    RETURN_HANDLER:
    if(pIDataInitialize)pIDataInitialize->Release();
    if(pIDBProperties)pIDBProperties->Release();
    if(pIDBPromptInitialize)pIDBPromptInitialize->Release();
    return hr;
    }
      

  6.   

    #include <MSDASC.H>
    #include <stdio.h>HRESULT GetDataSourceStringA(HWND,LPSTR,int)
    int main(int argc, char* argv[])
    {
    char sz[1024]={0};
    CoInitialize(NULL); if(SUCCEEDED(GetDataSourceStringA(NULL,sz,1024)))puts(sz);
    CoUninitialize();
    return 0;
    }
    HRESULT GetDataSourceStringA(HWND hWndParent,LPSTR lpDataSourceString,int cbString)
    { OLECHAR* wcsConnection = NULL; 
    HRESULT               hr                    = S_OK;
    IDBPromptInitialize* pIDBPromptInitialize   = NULL;
    IDBProperties* pIDBProperties   = NULL;
    IDataInitialize*     pIDataInitialize = NULL;  // Create a DataLinks object and get the IDBPromptInitialize interface of the object
    hr = CoCreateInstance(
    CLSID_DataLinks,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_IDBPromptInitialize,
    reinterpret_cast<void **>(&pIDBPromptInitialize));

    if(FAILED(hr))
    {
    goto RETURN_HANDLER;
    }
    hr = pIDBPromptInitialize->PromptDataSource(
    NULL,
    hWndParent,
    DBPROMPTOPTIONS_PROPERTYSHEET,
    0, NULL,
    NULL,
    IID_IDBProperties,
    reinterpret_cast<IUnknown **>(&pIDBProperties));
    if(FAILED(hr))
    {
    goto RETURN_HANDLER;
    }

    // Query IDataInitialize interface
    hr = pIDBPromptInitialize->QueryInterface(IID_IDataInitialize,(void**)&pIDataInitialize);
    if (FAILED(hr))
    {
    goto RETURN_HANDLER;
    } // call GetInitializationString method of IDataInitialize interface
    // to get the connection string
    hr = pIDataInitialize->GetInitializationString(pIDBProperties,true,&wcsConnection); if (FAILED(hr))
    {
    goto RETURN_HANDLER;
    }
    WideCharToMultiByte(CP_ACP,0,wcsConnection,-1,lpDataSourceString,cbString,NULL,NULL); CoTaskMemFree(wcsConnection); // 该不该有这个函数调用???
    RETURN_HANDLER:
    if(pIDataInitialize)pIDataInitialize->Release();
    if(pIDBProperties)pIDBProperties->Release();
    if(pIDBPromptInitialize)pIDBPromptInitialize->Release();
    return hr;
    }
      

  7.   

    不调用CoTaskMemFree好像也没问题,;)
      

  8.   

    调用CoTaskMemFree也好像没什么问题, ;(