如何修改通过值传递的原始变量的内容?
有一个现有的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; }
将变量放在struct中进行修改,并将指针传递给插件的sturuct:
struct MyStruct { BOOL bSave; int nOption; }; int ProcessMe(int nCommand, unsigned int wParam, long lParam) { ((MyStruct*)lParam)->nOption = ...; return 0; }
像这样用它:
int main() { MyStruct struct; struct.bSave = TRUE; struct.nOption = 0; ProcessMe(0, 0, (long)(&struct)); if(FALSE==struct.bSave) printf("bSave is modified!"); return 1; }
严格来说,这是未定义的行为。 您需要检查它是否适用于您的平台。
注意:我在这里使用了一个struct,因为这样你也可以将更多变量或更大的变量(如double)传递给函数。
不,没有办法做到这一点。
按值传递意味着创建原始副本。 在方法范围中,您将没有关于原始变量的信息。
您需要通过引用或按值传递。
编译32位平台,您可以转换为指针参数:
#include typedef int BOOL; #define FALSE 0 #define TRUE 1 int ProcessMe(int nCommand, unsigned int wParam, long lParam) { // cast to match what you passed in *((BOOL*)wParam) = FALSE; return 0; } int cast_arguments_main(int, char **) { BOOL bSave = TRUE; int nOption = 0; ProcessMe(0, (unsigned int)(&bSave), (long)(&nOption)); if(FALSE==bSave) printf("bSave is modified!"); return 1; }
在64位平台上,编译器抱怨无法表示指针:
cast_arguments.cpp:17:37: error: cast from 'BOOL*' to 'unsigned int' loses precision
我必须将unsigned int wParam
参数声明更改为unsigned long wParam
,并在调用点更改类似的更改: ProcessMe(0, (unsigned long)(&bSave), (long)(&nOption));
但是你可以简单地为参数声明正确的类型,即BOOL *
。 因此可行性取决于您的目标机器架构……
试试这个……这是可能的!
包括
int ProcessMe(int nCommand,unsigned int wParam,long lParam)
{
int *nCommand_ptr = (int*)nCommand; unsigned int *wParam_ptr = (unsigned int*)wParam; long *lParam_ptr = (long*)lParam; *nCommand_ptr = 10; *wParam_ptr = 10; *lParam_ptr = 10; return 0;
}
int main(){
int nCommand = 5; unsigned int wParam = 5; long lParam = 5; printf("\n %d %u %lu",nCommand,wParam,lParam); ProcessMe((int)&nCommand,(unsigned int)&wParam,(long)&lParam); printf("\n %d %u %lu",nCommand,wParam,lParam); return 0;
}
输出:
$> g ++ passbyref.cc
$> ./ a.out的
5 5 5
10 10 10 $>