Articles of ATL

将结构传递给IDispatch方法

在第三方COM模块中,我必须将一个结构传递给一个Method。 IDL定义的重要部分如下所示: interface ITheirInterface : IDispatch { [id(0x0000012d)] HRESULT TheirMethod([in] TheirStruct Attributes); }; struct TheirStruct { BSTR TheirFieldA; BSTR TheirFieldB; } TheirStruct; 我如何使用ATL从C ++调用方法? CComPtr<IDispatch> comPtr; comPtr.CoCreateInstance(L"theirModule.TheirCoClass"); CComVariant returnValue; CComVariant attribute= I_DO_NOT_KNOW_WHAT_TO_PLACE_HERE; comPtr.Invoke1(T2COLE(L"TheirMethod"),&attribute,&returnValue);

我可以在std :: map中使用CComPtr吗?

我正在用C ++编写Windows COM中的程序,我正在使用CComPtr来创build智能指针。 我无法find答案的问题是 – 我可以在std::map使用CComPtr 。 我有以下代码片段(简化): std::map<int, CComPtr<IErrorInfo> > ErrorMap; 我希望保持int s和IErrorInfo错误信息之间的映射。 不过,我不确定是否可以做到以下几点: CComPtr<IErrorInfo> result; GetErrorInfo(0, &pErrInfo); ErrorMap.insert(std::make_pair(0, result)); 我关心result智能指针的所有权,以及在ErrorMap被销毁时它是否能够正确释放?

连接到一个在IIS上运行的代码隐藏的COM接口?

我创build了一个Windows服务(一个基于Visual Studio ATL向导的exe),它暴露了一个COM接口。 作为进程内服务器或Windows服务运行没有问题。 我需要一个Windows服务,因为我需要在IIS访问之外提供一些进程。 我一直在创build一些调用我的服务的网页(aspx / C#),并且在Visual Studio .NET开发服务器中一切正常。 现在,我试图将网页推到IIS 7(在Windows 7上运行)进行进一步testing。 但是,当页面在IIS下运行时,对我的COM接口的调用都会失败并显示错误 “由于以下错误,检索组件的COM类工厂失败:80070005访问被拒绝(从HRESULTexception:0x80070005(E_ACCESSDENIED))。 我已经validation的服务是: 在Windows下注册HKCR \ Clsid \(注意,我注册运行“myservice.exe / RegServer”,因为regsvr32.exe只适用于dll的) myservice.exe已经读取并执行IIS_IUSRS用户的权限 是一个64位的EXE(所以应该加载在默认的IIS应用程序池空间) 在.NET开发服务器debugging器(但不是IIS) 任何想法,为什么这是行不通的? 与包含在exe和dll中的COM接口有什么关系? 在Windows服务中调用一个COM接口的IIS的任何可能性?

在Win2K / XP中检查目录的写入权限的代码

问候! 我正在尝试使用C ++检查Windows MFC / ATL程序中的目录写入权限。 我的第一个猜测是使用C标准的_access函数,例如: if (_access("C:\mydir", 2) == -1) // Directory is not writable. 但显然在Windows 2000和XP上,_access无法确定目录权限。 (即右键单击资源pipe理器中的目录时,“属性”对话框中的“安全”选项卡)那么,是否有一种优雅的方式来确定Windows 2000 / XP中使用任何Windows C ++库的目录的写入权限? 如果是这样,怎么样? 谢谢 埃文

ATL库:警告LNK4254和LNK4078

我正在使用Windows 7下的Visual C ++ 2010项目。我需要使用ATL库,事实上我安装了Windows WDK(版本7600.16385.1)特别是我使用WDK setupapi.lib atls.lib atlsd.lib atl.lib atlthunk.lib 编译我的代码我有以下警告: atls.lib(stdafx.obj):警告LNK4254:部分“ATL”(50000040)合并到具有不同属性的“.rdata”(40000040) atls.lib(stdafx.obj):警告LNK4078:具有不同属性的多个“ATL”部分(40301040) 有谁知道如何修理它? 我担心可能会发生内存泄漏或者访问我的数据时遇到一些问题。 谢谢

ATL和WTL有什么区别?

我知道“WTL build立在 ATL上”,但实际上这意味着什么? ATL是WTL的一个子集? (即ATL中的所有function是否也出现在WTL中?)我注意到维基百科说ATL的开发状态是“当前”,而WTL的最新版本是从2009年中期开始的。 这是否意味着如果我想使用Glass / Aero和其他Windows 7function编写Windows 7软件,那么我无法使用WTL来完成这项工作? ATL呢? 在ATL vs WTL中编写程序有没有什么性能/内存差异?

右单撇号与撇号?

右单引号(U + 2019)与撇号(U + 0027) 这两个字符有什么区别? 我遇到了这个问题,我使用CAtlString来从资源文件中加载string,而在某些Windows安装中,LoadString在加载包含U + 2019的string时失败,但是在其他一些Windows安装中可以使用。 U + 2019字符出现在我从Word复制的资源文件中的string中,U + 0027出现在手工编码的string中。 为什么LoadString(有时)会窒息?

学习WINAPI,MFC,ATL,WTL的最好的书

我想学习与Windows库编程。 你可以推荐我一些技术书籍/教程。 我不是在寻找一个开始的书,让读者知道C ++ / OOP / STDLIB / STL。 我需要覆盖的主题是〜WinAPI(基础/高级服务),MFC,COM,ATL和可能的WTL(如果有意义的话)。 我不是在学.NET,C#等等。 感谢帮助。

超出的COM服务器卡住了

我正在使用out-proc COM服务器(使用DECLARE_CLASSFACTORY_SINGLETON实现的COM单例“引擎”),它在STA(CComSingleThreadModel,_ATL_APARTMENT_THREADED)中工作。 COM服务器客户端: ActiveScript(JScript),(我使用AddNamedItem传递引擎引用)。 两个独立的IE BHO。 BHOs定期调用Engine :: dispatchEvent,Engine调用ActiveScript的JavaScript函数。 这个架构工作完美,直到我同时打开两个BHO。 如果我打开两个BHO,当我调用ActiveScript的函数(使用IDispatch / Invoke)时发生卡住。 我不创build任何额外的线程。 一些说明: 如果我不把从BHO检索到的对象传递给ActiveScript(或者用引擎中创build的同一对象replace它),一切正常。 只有当JScript垃圾收集器试图释放从BHO检索到的对象(callstack中的IUnknown_Release_Proxy)时才会发生阻塞。 调用堆栈: > ntdll.dll!_ZwWaitForMultipleObjects@20() + 0x15 bytes ntdll.dll!_ZwWaitForMultipleObjects@20() + 0x15 bytes KernelBase.dll!_WaitForMultipleObjectsEx@20() + 0x100 bytes kernel32.dll!_WaitForMultipleObjectsExImplementation@20() + 0x8e bytes user32.dll!_RealMsgWaitForMultipleObjectsEx@20() + 0xe2 bytes ole32.dll!CCliModalLoop::BlockFn(void * * ahEvent, unsigned long cEvents, unsigned long * lpdwSignaled) Line 1222 C++ ole32.dll!ModalLoop(CMessageCall * […]

以编程方式创buildWindows Media Player的基本播放

我试图通过COM “快速集成” Windows Media Player来播放本地文件系统或HTTP源中的单个文件 – 但是由于稀疏的文档和在线资源的使用,当没有embedded某种types的Ole容器时,我无法得到所谓的微不足道的用例。 初始化等工作正常,但实际上播放一些文件总是失败。 示例代码,从初始化开始(剥离的error handling,基本上从MSDN上的C#示例转换,在主线程上执行): CComPtr<IWMPPlayer> player; player.CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER); CComQIPtr<IWMPCore3> core(player); CComPtr<IWMPControls> controls; core->get_controls(&controls); CComPtr<IWMPPlaylist> playlist; core->get_currentPlaylist(&playlist); CComBSTR path("c:\\bar.mp3"); // alternatively http://foo/bar.mp3 玩的第一种方法是“命令不可用” : core->put_url(path); // … waiting after that for WMP to load doesn't make a difference controls->play(); // returns 0x000D1105 – NS_S_WMPCORE_COMMAND_NOT_AVAILABLE 第二种方法只产生S_OK s,但实际上没有任何东西被发挥: CComPtr<IWMPMedia> media; core->newMedia(path, […]