首页
社区
课程
招聘
[旧帖] 多线程下COM组件使用问题,附源码,请大家帮忙解决问题 0.00雪花
发表于: 2011-12-16 14:11 5325

[旧帖] 多线程下COM组件使用问题,附源码,请大家帮忙解决问题 0.00雪花

2011-12-16 14:11
5325
平常使用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)来初始化,但具体怎么实现 ,请大家帮忙改一下,谢谢!!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2210
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
不太懂COM,帮顶了,
是不是COM执行也需要时间,而Sleep(100)恰好使COM得以运行?
2011-12-20 13:21
0
雪    币: 7
活跃值: (353)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
处理好两个线程之间的同步问题,避免线程在读数据的时候,主线程又把数据改了的问题,跟com本身没关系
2011-12-20 16:09
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
回复楼上的:

为了测试,多线程,并取消数据同步问题,我的主线程里开了30个子线程,

同时有30个数组与之对应,stShortToPath mySt[30];

不存在同步问题呀,这个程序就是测试用的,do while 应该用for 来实现,意思就是产生

30个线程。
2012-1-6 08:11
0
雪    币: 1262
活跃值: (815)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
CoInitializeEx(NULL,COINIT_MULTITHREADED);

使用COM多线程套件初始化。
2012-1-6 08:58
0
游客
登录 | 注册 方可回帖
返回
//