如何修改通过值传递的原始变量的内容?

有一个现有的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 $>