EXPORTSDllRegisterServer @1 PRIVATE这里的PRIVATE是什么意思
还有在IDL文件里面,支持(IDISPATCH)怎么才能使用自己定义结构做参数。

解决方案 »

  1.   

    The optional keyword PRIVATE prevents entryname from being placed in the import library generated by LINK. It has no effect on the export in the image also generated by LINK.
      

  2.   

    楼上的。我懂得查msdn,谢谢!csdn那么多高人都去那了???
      

  3.   

    MSDN都写的这么明白了,就搞不懂你还会有什么不明白的了
      

  4.   

    IDISPATCH方式好像不支持自定义结构做参数的形式吧....
      

  5.   

    http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_exports.aspVisual C++ 概念:生成 C/C++ 程序   EXPORTS
    EXPORTS
    definitions
    EXPORTS 语句引入了一个由一个或多个 definitions(导出的函数或数据)组成的节。每个定义必须在单独一行上。EXPORTS 关键字可以在第一个定义所在的同一行上或在前一行上。.def 文件可以包含一个或多个 EXPORTS 语句。导出 definitions 的语法为:entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
    entryname 是要导出的函数名或变量名。这是必选项。如果导出的名称与 DLL 中的名称不同,则通过 internalname 指定 DLL 中导出的名称。例如,如果 DLL 导出函数 func1(),要将它用作 func2(),则应指定:EXPORTS
    func2=func1
    @ordinal 允许指定是序号而不是函数名将进入 DLL 的导出表。这有助于最小化 DLL 的大小。.LIB 文件将包含序号与函数之间的映射,这使您得以像通常在使用 DLL 的项目中那样使用函数名。可选的 NONAME 关键字允许只按序号导出,并减小结果 DLL 中导出表的大小。但是,如果要在 DLL 上使用 GetProcAddress,则必须知道序号,因为名称将无效。可选的 PRIVATE 关键字禁止将 entryname 放到由 LINK 生成的导入库中。它对同样是由 LINK 生成的图像中的导出无效。可选的 DATA 关键字指定导出的是数据,而不是代码。例如,可以导出数据变量,如下所示:EXPORTS
    i DATA
    当对同一导出使用 PRIVATE 和 DATA 时,PRIVATE 必须位于 DATA 的前面。有三种导出定义的方法,按照建议的使用顺序依次为: 源代码中的 __declspec(dllexport) 关键字 
    .def 文件中的 EXPORTS 语句 
    LINK 命令中的 /EXPORT 规范 
    所有这三种方法可以用在同一个程序中。LINK 在生成包含导出的程序时还创建导入库,除非生成中使用了 .exp 文件。以下是 EXPORTS 节的示例:EXPORTS
       DllCanUnloadNow      @1     PRIVATE   DATA
       DllWindowName = Name        DATA
       DllGetClassObject    @4 NONAME   PRIVATE
       DllRegisterServer    @7
       DllUnregisterServer
    注意,使用 .def 文件从 DLL 中导出变量时,不需要在变量上指定 __declspec(dllexport)。但是,在任何使用 DLL 的文件中,仍必须在数据声明上使用 __declspec(dllimport)。
      

  6.   

    纯IDispatch接口方式无解,如果是双接口的话可以将自定义结构封装在VARIANT里面,用VT_RECORD标志标示。
      

  7.   

    因为DllRegisterServer这些dll中的函数本质上是由COM在运行时调用的,所以要禁止静态的编译后link,只容许被动态加载,所以只能定义成PRIVATE的,否则出错
      

  8.   

    http://www.cnblogs.com/neoragex2002/articles/77818.html
    一篇转载的文章
      

  9.   

    1.你在其他工程里引用这个DLL的LIB文件时,看不到PRIVATE修饰的导出函数。但是显式调用DLL时,能通过GetProcAddress看到这些导出函数。
    2.你可以在IDL文件里加上这些自定义结构的语句:
    typedef [uuid(...)]
    struct {
       ...
    } ...;
    然后在接口的参数里就可以引用typedef定义的类型名了。注意两点:
    1)每个typedef必须有一个GUID,这可以通过VC的工具UUIDGEN(也许叫GUIDGEN,我忘了)生成。
    2)结构里的每个域必须是Automation(IDispatch)支持的类型。