微软研究院的高手请进,迫切需要你们的支持!(300分求解)

Tasehouny 2002-06-14 06:43:07
http://www.csdn.net/expert/topic/802/802513.xml?temp=.6049768
http://www.csdn.net/expert/topic/800/800320.xml?temp=5.584353E-02

同一问题,上两贴已经发了200分,此处在追加100分。
看上边的题,如能解决,300分全部敬上。


CFileDialog 对话框在DCOM环境中不能用,反复调试,发现了问题所在,但不知该如何解决。

大家有兴趣可以做一个试验,随便生成一个对话框,放一个按钮,在按钮的事件中写下列代码:
void CTestOpenDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE);
dlg.DoModal();
}
编译,运行,没有问题!

下边,开始模拟我的环境,在stdafx.h中加入
#include <atlbase.h>

在Project -> Settings 中设置PreProcessor Definitions
添加 _WIN32_DCOM

第三步,在你的app 的Instance 和Extance中添加如下的代码

BOOL CTestOpenApp::InitInstance()
{
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
.......
...
}

int CTestOpenApp::ExitInstance()
{
CoUninitialize();
return CWinApp::ExitInstance();
}


编译运行,你会发现,CFileDialog对话框,弹不出来了,把HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);注释调,就可以,显然是和DCOM有什么冲突?

怎么解决呢?
高手们站出来吧!!!!!

...全文
104 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cadinfo 2002-06-17
  • 打赏
  • 举报
回复
或者可以自己写打开文件的对话框,
现成的代码应该流传很广,
不要告诉我什么对话框窗体都没法显示,
那就真的没辙了。
cadinfo 2002-06-17
  • 打赏
  • 举报
回复
不可能,我再次测试了一下,
我的机器VC5+SP5,W2K+SP2,
仔细看了你的回复,发现你说得有道理,
1.我没有试过AfxOleInit()能否代替CoInitializeEx(...)初始化MTA
2.我的返回码是RPC_E_CHANGED_MODE
MSDN给出的解释如下:
A previous call to CoInitializeEx specified a different concurrency model for the calling thread. If running Windows 2000, this could also mean that a change from neutral threaded apartment to single threaded apartment occurred.
是否意味着你的MTA确实在这种情况初始化出错!
3.我把AfxOleInit()的代码段屏蔽掉,结果返回S_OK
显然COM环境初始化成功,允许代码发现CFileDialog无法显示******
也许多线程和文件对话框的显示原本就存在冲突!
原因1.MS的BUG;2.理论上存在矛盾,天生缺陷导致无法实现。
4.顺序问题同意你的观点,也许是一个约定俗成的规矩,虽然两者都没有错误。

Tasehouny 2002-06-17
  • 打赏
  • 举报
回复
vtable9999(肝肝肝肝)
你发给我的代码,不能用!

但可以在其他的机器上用。
虽然如此,还是感谢!
Richuen22 2002-06-17
  • 打赏
  • 举报
回复
关于返回值
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if(hRes == S_OK)
AfxMessageBox("Is Right!");
应该是顺序问题,另外虽然你升级到了SP5,但SDK未更新,要另外DownLoad的。
cadinfo 2002-06-17
  • 打赏
  • 举报
回复
下午看了一下,原来你说的版本问题是这么一回事,
Comctl32.dll version 5.81.3103.1000 未打补丁
Comctl32.dll version 5.81.4704.1100 打过SP2
这可以在%system%\ServicePackFiles\i386 找到原来的备份

我把原来版本文件拷贝到当前目录,仍然出现原来的问题。
只是疑惑的是save as对话框却不存在问题?
Tasehouny 2002-06-16
  • 打赏
  • 举报
回复
??
cadinfo 2002-06-16
  • 打赏
  • 举报
回复
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
~~~~~~~~~~~~~~~~~~~~~~
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
之后。
cadinfo 2002-06-16
  • 打赏
  • 举报
回复
无需:微软研究院的高手支持@@
Tasehouny (阿甘)朋友的VC或者系统存在问题,
今天我在我的爱机测试过了,
在DEBUG版本下完全正确,通过(使用的是你的源代码)
在RELEASE版本出现问题,
error C2065: 'CoInitializeEx' : undeclared identifier
后来查看发现原来是在Project -> Settings 中设置PreProcessor Definitions
添加 _WIN32_DCOM 即可,也就是你的方法。

我想存在地问题可能是你在其它地方误添加了其它代码。
也有可能是在InitInstrance添加
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
位置不正确,正确的位置应该在
AfxEnableControlContainer();
~~~~~~~~~~~~~~~~~~~~~~
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
之后。
祝好运!
neush 2002-06-16
  • 打赏
  • 举报
回复
up
daehappy 2002-06-16
  • 打赏
  • 举报
回复
up!关注!
Tasehouny 2002-06-16
  • 打赏
  • 举报
回复
又有的新的发现,我的程序在别的机器上是可以用的,我反复对比发现,我的机器上用的Comctl32.dll version 5.81.4704.1100
而其他安装了SP2的WIN2000机器上的 Comctl32.dll version 5.81.3103.1000

难道就是这个区别吗?

为了表示对各位的感谢,我决定再增加100分答谢大家,稍后,我会给各位兑现的!
Tasehouny 2002-06-16
  • 打赏
  • 举报
回复
cadinfo(无语清风)

你的方法我试过了,虽然CFileDialog能用,但你发现没有
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
的返回值是什么,这样的话MTA仍然是不能用的!

我再测试发现我的问题出在 CoInitializeEx的第二个参数上,如果使用COINIT_APARTMENTTHREADED 则也没有问题,但如果是COINIT_MULTITHREADED则必死无疑。

AfxOleInit() 是不能代替 CoInitializeEx(NULL, COINIT_MULTITHREADED);
我的组件是再MTA下工作的!

至于你说的顺序问题,我持保留意见,可以从微软的代码中看出,一般都在第一句上,我认为应该在AfxEnableControlContainer();之前。

况且,我的问题根源所在不是在顺序上!


不知为什么?



zhang1000 2002-06-16
  • 打赏
  • 举报
回复
同意cadinfo(无语清风)!
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
这个我都没用上.
Richuen22 2002-06-16
  • 打赏
  • 举报
回复
我也可以,WinMe, VC6+SP4。
我的stdafx.h如下
.
.
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <atlbase.h> //这句是我加上的,上面的不是

我的CXX.CPP如下
BOOL CZeApp::InitInstance()
{
.
.

#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED); //这句才是我加上的
CZeDlg dlg;
Tasehouny 2002-06-15
  • 打赏
  • 举报
回复
我用的也是 win2000 sp2, vc 6.0 sp5

CoInitializeEx(NULL, COINIT_MULTITHREADED);
不是 CoInitialize(NULL),

OPENFILENAME API
好像也不行!
Lemon_2000 2002-06-15
  • 打赏
  • 举报
回复
up
vtable9999 2002-06-15
  • 打赏
  • 举报
回复
在Win2000、VC6.0,你的代码在我这可以打开对话框!!!!!
chenybin 2002-06-15
  • 打赏
  • 举报
回复
up算了
蒋晟 2002-06-15
  • 打赏
  • 举报
回复
OPENFILENAME API是否可以工作?
Tasehouny 2002-06-14
  • 打赏
  • 举报
回复
有人告诉我用 AfxOleInit 代替CoInitializeEx,实际操作中不能代替,这样的话,虽然能解决对话框的问题,但导致使用MTA的组件无法创建成功!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧