c原著: randy more. 建立一個擁有自己的資源文件(例如對話框資源)的動態(tài)鏈接庫工程 ,并在別的工程中調(diào)用. in the dll function that pops up the dialog you must manage the state so that the dll code uses the dll‘s resources.
extern __declspec(dllexport) void showeditdialog(int &mydata1, int &mydata2)
{
//ensure we are using our own resources
afx_manage_state(afxgetstaticmodulestate());
cmylocaldialog dlg;
dlg.arg1 = mydata1; //specific local data for mylocaldialog
dlg.arg2 = mydata2;
dlg.domodal();
mydata1 = dlg.arg1; //data after processing
mydata2 = dlg.arg2;
}
外部調(diào)用這個動態(tài)鏈接庫的程序中不能直接用 getlasterror()來判斷錯誤的發(fā)生.這是因為 afx_manage_state macro建立一個臨時的堆棧,當(dāng)函數(shù)結(jié)束時會自動析構(gòu),其中保存的錯誤當(dāng)然也不復(fù)存在。 解決方案 :
extern __declspec(dllexport) void showeditdialog(int &mydata1, int &mydata2)
{
dword dwlasterr = no_error;
//
// surround the code in brackets, which will cause the temporary
// object created by afx_manage_state to be destroyed before leaving
// the exported function.
//
// note : do not call mfc code outside of these brackets.
//
{
afx_manage_state(afxgetstaticmodulestate());
cmylocaldialog dlg;
dlg.arg1 = mydata1; //specific local data for mylocaldialog
dlg.arg2 = mydata2;
dlg.domodal();
mydata1 = dlg.arg1; //data after processing
mydata2 = dlg.arg2;
//
// save possible errors
//
dwlasterr = ::getlasterror();
}
//
// only set error if none is currently set.
// (last error will always be no_error _unless_
// tlsgetvalue failed earlier)
//
if (::getlasterror() == no_error)
::setlasterror(dwlasterr);
}
|
|
|