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.
楼上的。我懂得查msdn,谢谢!csdn那么多高人都去那了???
MSDN都写的这么明白了,就搞不懂你还会有什么不明白的了
IDISPATCH方式好像不支持自定义结构做参数的形式吧....
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)。
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)。
一篇转载的文章
2.你可以在IDL文件里加上这些自定义结构的语句:
typedef [uuid(...)]
struct {
...
} ...;
然后在接口的参数里就可以引用typedef定义的类型名了。注意两点:
1)每个typedef必须有一个GUID,这可以通过VC的工具UUIDGEN(也许叫GUIDGEN,我忘了)生成。
2)结构里的每个域必须是Automation(IDispatch)支持的类型。