Tag: com

使用plain C创建COM对象

根据MSDN文档 ,您可以创建一个COM对象来访问VB中的Internet Explorer; Dim IE As SHDocVw.InternetExplorer Set IE = CreateObject(“InternetExplorer.Application”) 据我所知,COM对象应该与语言无关。 因此,我认为应该可以在普通C(非C ++)中执行此操作。 如何在Windows操作系统上使用纯C创建任何COM对象?

将BSTR转换为CHAR *,将CHAR *转换为C中的BSTR

我必须在BS中将BSTR转换为CHAR *数据类型。无论如何都要在不使用VC ++库或函数的情况下执行此操作。 代码必须是纯C.我认为’comutil.h’有函数,但我想它们是C ++。 另外,关于SysAllocString函数,我们可以在C中使用它并转换为CHAR *吗? 请帮忙。 谢谢,sveerap

为什么在SUCCEEDED宏中有这么多括号?

Windows SDK具有SUCCEEDED宏: #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) ———————–^————-^—– 与其他宏一样,有一些括号可以确保编译器正确解释意图。 我没有得到的是为什么周围有括号(HRESULT)(hr) (我用^字符标记它们)。 hr括号括起来,以便有一些复杂的构造可以存在, HRESULT被括号括起来形成一个C风格的HRESULT转换,然后整个>=构造也被括号括起来,那么为什么额外的一对括号(HRESULT)(hr)呢?

如何在C中调用COM组件

我必须从Visual Studio中的C语言调用COM组件。 我可以通过指定.tlb文件使用’#import’指令从Visual C ++中调用它。 但我没有在C语言中看到#import指令。 我可以使用替代方案吗? 我不能用C ++编写,因为我必须只用纯C创建模块。

对CLSID_MMDeviceEnumerator和IID_IMMDeviceEnumerator的未定义引用

尝试使用COM和CoCreateInstance()在C中使用MinGW-w64编译示例代码失败。 #include #include #include #include #include extern const CLSID CLSID_MMDeviceEnumerator; extern const IID IID_IMMDeviceEnumerator; int main( void ) { CoInitialize( NULL ); LPVOID device = NULL; const HRESULT ok = CoCreateInstance( &CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &device ); CoUninitialize(); return EXIT_SUCCESS; } 编译:gcc main.c libole32.a -Wall -Wextra -oa 即使在mmdeviceapi.h中定义了CLSID_MMDeviceEnumerator,也找不到它。 实际上从示例代码中删除我的extern定义会得到相同的结果,因为两个externs似乎都在mmdeviceapi.h中定义 当我使用__uuidof并使用g ++编译代码时,但__uuidof的这个C“替换”却没有。 为什么没有找到COM标识符?

COM的跨平台替代方案

我一直迷恋于基于组件的编程(无论是COM,另一个系统,还是只使用普通C ++中的范例)。 它需要一点习惯,如果一个人习惯于“传统的”OOP模型,但它是值得的。 它使我的代码更易于维护和扩展。 我目前正在研究的项目是使用范例,但没有设置系统。 但是,我真的很想找到一些可以满足以下要求的系统。 从我现在的切换到新系统需要花费一些时间,但是我稍后会节省多倍的时间。 要求: 跨平台 快速 适用于C ++ 支持跨进程编组 让我详细说明这些要求: 跨平台 基本上,我需要它在Windows和Mac上工作。 Linux会很好,但绝不是必不可少的。 此外,它确实需要满足所有平台的其他要求。 有一个适用于Mac的COM,这将是理想的,但它不支持要求4.此外,它必须支持GCC和MSVC。 快速 不幸的是,这就是CORBA失败的地方,尽管它满足了其他三个要求。 进程内方法调用需要尽可能快(理想情况下,如COM),因为某些例程也可能从音频中断调用。 适用于C ++ ……我想这一点大多是显而易见的。 我不介意不使用C ++类来实现组件,虽然这将定义有用,并且替代方案必须仍然易于使用,特别是因为最终我打算发布第三方扩展的API。 支持跨进程编组 我的意思是至少能够序列化呼叫。 如果这是通过IDL生成的代码完成的,那对我来说完全没问题,而且我也不介意实现跨进程通信本身。 COM会很棒,但它不能完全满足要求1。 CORBA也会很棒,但它不符合要求2(即使有最快的ORB)。 XPCOM可能不符合要求2,并且不适用于MSVC,因此不符合要求1。 还有什么想法吗? 我的下一步是使用protobufs或类似的东西滚动我自己,但当然我想避免这样做。 更新 详细说明 – 在此上下文中的音频中断可以低至2-3ms。 那个时间甚至不能完全提供给我,因为其他组件需要在那个时间处理,而我的软件本身就包含了另一个需要在那个时间处理的软件。 这就是为什么在进程和跨进程编组都需要非常快的原因。

Media Foundation使用C而不是C ++

我正在学习使用C代替C ++从Microsoft网站上显示的示例代码中使用Media Foundation API。 示例代码如下所示。 HRESULT CreateVideoCaptureDevice(IMFMediaSource **ppSource) { *ppSource = NULL; UINT32 count = 0; IMFAttributes *pConfig = NULL; IMFActivate **ppDevices = NULL; // Create an attribute store to hold the search criteria. HRESULT hr = MFCreateAttributes(&pConfig, 1); // Request video capture devices. if (SUCCEEDED(hr)) { hr = pConfig->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID ); } // […]

在没有ATL的情况下实现COM IDispatch

我正在编写一个Excel RTD服务器实现,我被困在一个实现IDispatch的coclass的样板上。 我无法访问ATL,但我使用的是ActiveQt,虽然我对如何在原始C或C ++中执行此操作感兴趣。 如何在COM服务器中正确实现IDispatch方法? 一如既往,文档非常糟糕。 到目前为止我所读的内容如下: 最好将IDispatch方法调用委托给某个ITypeInfo 。 它是否正确? 如果是这样,如何获得ITypeInfo给自己? LoadTypeLib()和family(后面是查看ITypeLib::GetTypeInfo() )? 如果没有,它是如何正确实施的? 与高质量文档和自包含示例的链接非常有用。 LoadTypeLib()方法似乎适合COM 客户端访问某些库的类型信息,而不适用于尝试内省自身的COM服务器。 我对么?

COM,COM +,DCOM,从哪里开始?

我很好奇COM +,DCOM。 我知道MSFT不鼓励你本地使用这个工具(意思是用C / C ++,实际上没有很多可用的文档)但我想学习使用这些技术,比如将Internet Explorer嵌入到C程序中。 我想也许我可以找到那些使用过这个或那个知道这项技术的人。 从哪儿开始? 有任何想法吗? 任何例子(如Hello World DCOM)?

MSVC中的“interface”关键字是什么?

我正在浏览Windows 8.1 SDK和UnknownBase.h中的内容 typedef interface IUnknown IUnknown; 我之前从未见过这个interface关键字。 请注意,这绝对是一个.h标头,由cl.exe处理。 它不是IDL文件,并且它不由midl.exe处理。 我在网上找到了这个: http : //msdn.microsoft.com/en-us/library/50h7kwtb.aspx 但__interface与interface 谁能在这里提醒我?