7

我是 COM 编程的新手,并且从 Visual Studio 2010 创建了一个基本的本机 COM 服务器/客户端对。客户端和服务器项目都存在于同一个解决方案中。我想知道最合适的方法是将生成的客户端存根和头文件包含在客户端项目中。我在我的服务器项目中创建了 MIDL,当我编译项目时,在我的项目源目录中生成了 _h.h、_i.c 和 _p.c 文件。

  • 我需要在我的客户端项目中编译这两个 .c 文件吗?
  • 通过将它们作为链接文件从服务器项目的源目录添加到客户端项目中,在客户端项目中编译它们的最佳方法是什么?
  • 有没有办法让 Visual Studio 在我修改 MIDL 时知道 _h.h、_i.c 和 _p.c 文件已过期,或者我是否需要记住在我触摸时重新编译服务器项目米德尔?
  • .h 文件的最佳存放位置在哪里?它可以存放在服务器项目的 stdafx.h 文件中吗?如果是这样,将服务器项目的源目录添加到客户端项目的标头包含目录中是否合适?
  • 客户端项目是否应该对服务器项目有一个“参考”(在 Visual Studio 参考意义上)?

另外 - 我想让这个注册免费。在这种情况下,除了为我的客​​户端和服务器提供清单之外,我还需要做些什么吗?

..

编辑

看看这里的 MSDN 文章:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa366830 (v=vs.85).aspx ,如果我只想为了支持进程内免注册激活,我只需要编译 _i.c 并将 _h.h 文件包含在我的客户端程序中。

dlldata.c 和 _p.c 似乎用于创建代理 DLL,该代理 DLL 支持在远程计算机上注册(用于远程计算机激活?或者本地计算机,在 proc 之外?如果本地计算机需要,out proc,既然注册了COM服务器的dll,为什么需要它?COM服务器DLL与代理DLL不同,是吗?)

非常感谢,

——马特

4

1 回答 1

7

生成的 _p.c 和 dlldata.c 必须编译到单独的项目中才能构建代理/存根 DLL。您并不总是需要一个,只有在您跨单元或进程编组呼叫时才需要。

生成的 _i.c 文件提供 GUID 值。将其编译到服务器和代理/存根中。将它编译到客户端是可以的,但使用 __uuidof 关键字是最简单的。

生成的 _i.h 文件包含接口和 coclass 声明。您需要将其#include 到服务器和客户端中。

当您更改 .idl 时,Midl.exe 应该会自动重新生成这些文件。这反过来又确保了客户端、服务器和代理/存根得到重建。

stdafx.h 很好,在包含目录中是的。

“引用”上没有,客户端和服务器没有链接依赖。

您必须为 reg-free com 编写清单并将其嵌入到客户端中。

于 2012-04-17T06:42:38.003 回答