OLECHAR* wcsConnection = NULL;
hr = pIDataInitialize->GetInitializationString(pIDBProperties,true,&wcsConnection);请教是否需要释放wcsConnection
hr = pIDataInitialize->GetInitializationString(pIDBProperties,true,&wcsConnection);请教是否需要释放wcsConnection
行吗?
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 指向的内存,又不知这块内存何去何从。请大虾指点迷津,感激不尽!
#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;
}
#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;
}