在编程中经常会遇到在应用程序间传递参数的问题
我总结了两种方法
一。在用ShellExcute启动另外一个应用程序的同时将参数传递过去.
函数ShellExcute的原型:
HINSTANCE ShellExecute(
HWND hwnd,//父窗口的窗口句柄
LPCTSTR lpOperation //操作类型有"open","print","explore"三种。如果该参数为NULL,则默认为打开类型open打开应用程序时为"open"
LPCTSTR pFile,//子窗口的文件名(全路径
LPCTSTR lpParameters, //要传递到子窗口中的参数
LPCTSTR lpDirectory //子应用程序的默认路径
INTnShowCmd; //子窗口的显示方式,如SW_SHOWNORMAL
);
具体做法如下:
在父程序中调用子程序,并传递参数sParameter :
CString playexePath= "......";
CString sParameter = "......"; ShellExecute(NULL,NULL,playexePath,sParameter ,NULL,SW_NORMAL);
在子程序中接受父窗口传过来的参数:
在子程序的工程中,***App类的InitInstance函数中加入接受参数的代码:
BOOL CPlayWaveApp::InitInstance() { 。。。。。。
//取得语音回放窗口中传过来的参数 if(__argc >= 1) { strparameter = __argv[1]; //strparameter 为子程序中存放传过来的参数的变量 }
。。。。。。
}
二。用WM_COPYDATA消息在应用程序间传递参数:
在父程序中用如下的代码: CString strWindowTitle = _T(”Window Name“);//父窗口标题 CString strDataToSend = _T("This is a message to send"); //要传递的变量 LRESULT copyDataResult; CWnd *pOtherWnd = CWnd::FindWindow(NULL, strWindowTitle); if (pOtherWnd) { COPYDATASTRUCT cpd; cpd.dwData = 0; cpd.cbData = strDataToSend.GetLength(); cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData); copyDataResult = pOtherWnd->SendMessage(WM_COPYDATA, (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(), (LPARAM)&cpd); strDataToSend.ReleaseBuffer(); // copyDataResult has value returned by other app } else { AfxMessageBox("Unable to find other app."); }
在子程序中添加WM_COPYDATA的消息相应函数OnCopyData,在该函数中接受传过来的变量,代码如下
注意:用WM_COPYDATA传递参数时,必须在子窗口显示以后才可以传递参数。否则会由于找不到子窗口而无法传递。