【发布时间】:2012-04-13 20:24:57
【问题描述】:
现有的 API 函数只允许插件(DLL)接收三个参数并执行一些操作:
int ProcessMe(int nCommand, unsigned int wParam, long lParam);
现在,从主程序(exe),想传递两个变量给插件,并要求插件修改它们的内容,主程序将再次读取它们,以执行一些任务。
我的问题是,从上面的函数中,我可以在不改变函数参数的情况下执行这个吗?
例子:
int ProcessMe(int nCommand, unsigned int wParam, long lParam)
{
// modify the parameters//
return 0;
}
int main()
{
BOOL bSave = TRUE;
int nOption = 0;
ProcessMe(0, (unsigned int)(&bSave), (long)(&nOption));
if(FALSE==bSave)
printf("bSave is modified!");
return 1;
}
【问题讨论】:
-
没有。您需要通过引用传递,如果不更改 API,您将无法做到这一点。你要么必须用指针重新实现接口,要么学会在没有指针的情况下生活。
-
遗憾的是,我不允许更改接口,因为目前有许多其他 DLL 使用类似接口与 exe 一起运行....对我来说是向后兼容性问题 :(
-
这没有意义。该函数不会期望使用参数来存储结果。它们不是为了输出。你需要声明一个新函数。
-
可以做到:传递给函数的参数仅按值传递,但最后一个参数实际上可以是地址(按值传递),以便 ProcessMe 可以操作该地址处的数据: 在调用程序中将指针转换为 long,反之亦然。
-
虽然将指针作为 lParam 传递会很小心,(请参阅所有其他有关问题的帖子),您应该注意此调用的格式与 Windows SendMessage/PostMessage 类似。如果此调用是 PostMessage 包装器,则调用返回时发出的请求可能尚未完成,因此调用中引用的任何 var 可能尚未写入。
标签: c++ c api parameter-passing