发现同样的[in]接口函数,dll和exe表现的不一样!

sanfrany 2014-01-08 11:15:12
例如,我新建一个dll的atl工程,里面添加一个atl简单对象叫做Bar,接口定义里面有两个功能相同的函数

[id(6)] HRESULT ChangeLong([in] LONG* pLong);
[id(7)] HRESULT ChangeLongOut([out] LONG* pLong);

都是把输入的pLong的值加上10。
我写一个客户端调用,代码如下:

CoInitialize(NULL);
IBarPtr p(CLSID_Bar,NULL,CLSCTX_ALL);
long a=0;
p->ChangeLong(&a);
printf("%d\n",a);
p->ChangeLongOut(&a);
printf("%d\n",a);
p.Release();
CoUninitialize();

符合我的预期,每次函数调用后a都增加了10

但是如果这个atl的工程是exe的,那么当我的代码和客户端保持不变的时候,上面那个[in]类型参数的ChangeLong函数,调用后a不变,而[out]类型参数的ChangeLongOut函数,调用完之后a才增加10.

奇怪了,看起来[in]类型参数,对于dll会发生改变,对于exe就不会发生改变,而[out]类型的参数总是能改变的。
我连续测试了好几次结果都是这样。这是com的一个特性吗? in和out都是传入一个指针的话,为什么dll符合我预期,而exe下行为不同呢?

多谢指点!
...全文
115 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 2 楼 u013375832 的回复:
[quote=引用 1 楼 caozhy 的回复:] exe是进程外组件,不能直接传地址。
那么进程外组件不直接传地址的话,为什么in的参数传递完以后没有改,out的参数传递后改了?[/quote] 在调用前打印a的地址,在ChangeLong ChangeLongOut函数内打印pLong 就知道为啥了。
oyljerry 2014-01-10
  • 打赏
  • 举报
回复
进程外,会帮你做进程间的数据传递
threenewbee 2014-01-09
  • 打赏
  • 举报
回复
exe是进程外组件,不能直接传地址。
sanfrany 2014-01-09
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
exe是进程外组件,不能直接传地址。
那么进程外组件不直接传地址的话,为什么in的参数传递完以后没有改,out的参数传递后改了?

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧