平常使用COM组件都是用单线程,这两天想试用一下多线程,碰到些问题
测试程序的功能就是把快捷方式转换成实际路径。
线程函数:
是每次在线程里初始化COM组件 (CoInitialize(NULL);)
DWORD WINAPI GetShortCutFile(PVOID pvParam)
{
HRESULT hres;
IShellLink *psl;
IPersistFile *ppf;
WIN32_FIND_DATA fd;
stShortToPath *pstTmp;
pstTmp=(stShortToPath*) pvParam;
CoInitialize(NULL);
hres = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (PVOID*)&psl );
if (!SUCCEEDED(hres)) return false;
hres = psl-> QueryInterface(IID_IPersistFile, (PVOID*)&ppf );
if( SUCCEEDED(hres) )
{
ppf-> Load(pstTmp->tcShortCut, STGM_READ);
if( SUCCEEDED(hres) )
hres = psl-> GetPath(pstTmp->tcFileName, sizeof(pstTmp->tcFileName), &fd, NULL );
wprintf(L"%s\nPointed=>%s\n",pstTmp->tcShortCut,pstTmp->tcFileName);
ppf-> Release();
}
psl-> Release();
CoUninitialize();
return SUCCEEDED(hres);
}
主程序如下
int _tmain(int argc, _TCHAR* argv[])
{
stShortToPath mySt[30];
int i=0;
int bFind;
WIN32_FIND_DATA FindFileData;
memset(&FindFileData,0x0,sizeof(WIN32_FIND_DATA));//初始化WIN32_FIND_DATA结构
TCHAR strPath[]=L"用户Recent\\*";
HANDLE hSearch = FindFirstFile(strPath, &FindFileData);
if(hSearch!=INVALID_HANDLE_VALUE )
{
do
{
if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))//不是目录是快捷方式
{
wcscpy_s(mySt[i].tcShortCut,strPath);
PathRemoveFileSpec(mySt[i].tcShortCut);
wcscat_s(mySt[i].tcShortCut,L"\\");
wcscat_s(mySt[i].tcShortCut,FindFileData.cFileName);
CreateThread(NULL,0,GetShortCutFile,(LPVOID) &mySt[i],0,NULL);
Sleep(100);//加上它才能使线程函数正确返回
i++;
}
bFind=FindNextFile(hSearch,&FindFileData);
}while(bFind);
}
Sleep(10000);
return 0;
}
主程序专门加了Sleep(100),才能使每个线程调用COM成功,如果不加sleep
30个快捷方式里可能会有10多个解析不了,可能调用COM没有成功
现在问题是想把调用COM那里改成多线程的,只知道初始化COM时使用
CoInitializeEx (NULL,COINIT_MULTITHREADED)来初始化,但具体怎么实现 ,请大家帮忙改一下,谢谢!!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!