万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0
问题是这样产生的:建立一个MFC应用程序,加入ATL支持,并加入一个ATL对象,然后在程序中创建如下
CComPtr<IMath>    spMath;
    HRESULT            hr        
= NOERROR;
    hr 
= spMath.CoCreateInstance(L"COMInMFC.Math.1");
    
if(SUCCEEDED(hr))
    
{
        spMath.Release();
    }
结果总是返回“无效的字符串”。我直接把COM对象new出来,再QueryInterface是没有问题的,很明显注册表没有注册正确。稀里哗啦修改一通,还是不正确。转到VS2003、VS2005按照类似做法完全没有问题,于是我开始怀疑难道我的VC6 IDE有问题?因为我以前从来没有遇到类似问题,印象中还模糊记得以前做过类似操作没有这样的问题。转到笔记本上再试一试,还是老样子。唉!先放一下,这是昨天的问题哈!
昨天晚上睡觉还惦记这这个问题,今天早上起床,胸口闷,还是不甘心,一定找出问题所在。打开工程,直接找写注册表的位置,发现拉,在InitATL函数中有这样一段:
LPTSTR lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
    TCHAR szTokens[] = _T("-/");

    BOOL bRun 
= TRUE;
    LPCTSTR lpszToken 
= _Module.FindOneOf(lpCmdLine, szTokens);
    
while (lpszToken != NULL)
    
{
        
if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
        
{
            _Module.UpdateRegistryFromResource(IDR_COMINMFC, FALSE);
            _Module.UnregisterServer(TRUE); 
//TRUE means typelib is unreg'd
            bRun = FALSE;
            
break;
        }

        
if (lstrcmpi(lpszToken, _T("RegServer"))==0)
        
{
            _Module.UpdateRegistryFromResource(IDR_COMINMFC, TRUE);
            _Module.RegisterServer(TRUE);
            bRun 
= FALSE;
            
break;
        }

        lpszToken 
= _Module.FindOneOf(lpszToken, szTokens);
    }
原来要注册一下啊,赶紧命令行执行一下:
D:\VC\Automation\COMInMFC\Debug\COMInMFC.exe /RegServer
然后创建对象,成功了,终于体会到:世上无难事,只怕有心人!
posted on 2006-09-01 08:18 万连文 阅读(1268) 评论(1)  编辑 收藏 引用 所属分类: MFC

FeedBack:
# re: VC6的MFC应用中集成COM的一个小问题
2006-09-07 19:48 | pdkui
MFC里添加了ATL对象,在同一个工程里的话,可以在ATL对象加一个静态函数:CreateInstance(),直接返回一个指针。当然,不在一个工程里就另当别论了。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


简历下载
联系我

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜