void TestSaveFunc(int a,int b)
{
CString TStr;
TStr.Format("%d %d",a,b);
AfxMessageBox(TStr);}void EndTest()
{}
SaveFunc()
{
CFile MyFile;
CString Path;
Path.Format("%s\Code.dat",GetAppPath()); if(MyFile.Open(Path,CFile::modeCreate|CFile::modeReadWrite))
{
int nSize=(int)((DWORD)&EndTest-(DWORD)&TestSaveFunc);//这里出来不对
MyFile.Write((BYTE *)&TestSaveFunc,nSize);
MyFile.Close();
}
}
{
CString TStr;
TStr.Format("%d %d",a,b);
AfxMessageBox(TStr);}void EndTest()
{}
SaveFunc()
{
CFile MyFile;
CString Path;
Path.Format("%s\Code.dat",GetAppPath()); if(MyFile.Open(Path,CFile::modeCreate|CFile::modeReadWrite))
{
int nSize=(int)((DWORD)&EndTest-(DWORD)&TestSaveFunc);//这里出来不对
MyFile.Write((BYTE *)&TestSaveFunc,nSize);
MyFile.Close();
}
}
解决方案 »
- ATL: IPersistStreamInitImpl::InitNew失败
- 程序中用到自定义消息,怎么才能使程序的多个实例互不干扰?
- 关于滚动条---处理MouseMove消息的问题
- 在那里能下载RSView32呢?
- 要为字符串强制一个结束符str[10] = '\0',请问这样可以吗 ?str[10] = 0。
- 一个关于MDI的极简单问题???《《《《在线等待》》》》
- 请教怎样制作安装程序
- 菜鸟的疑惑,请指教
- 好问题,千万别错过。怎样使自己的类能够被CArray支持.
- 谁了解TrueType字体的格式?有高分等候!!
- vc6.0 Tools 菜单下的 Macros怎么用?
- 截获对话框弹出消息
这段代码里EndTest和TestSaveFunc是一条跳转指令(5字节),所以nSize你会得到-5,
如果你去内存观察的话就会发现,EndTest 是 Jmp xxxx一个偏移,把代表Jmp 的0xE9跳过,那两个值相减才是真正的大小。
所以在默认的编译器选项中代码应该改成
//===========================================
void TestSaveFunc(int a,int b)
{
CString TStr;
TStr.Format("%d %d",a,b);
AfxMessageBox(TStr);}void EndTest()
{}typedef struct JMPCALLSTRUCT
{
BYTE bJmp[5];
}*LPJMPCALLSTRUCT;void SaveFunc()
{
CFile MyFile;
CString Path;
Path.Format("C:\\Code.dat");
LPJMPCALLSTRUCT lpEnd = (LPJMPCALLSTRUCT)EndTest;
LPJMPCALLSTRUCT lpTestSaveFunc = (LPJMPCALLSTRUCT)TestSaveFunc;
DWORD dwEndTest = *(LPDWORD)&lpEnd->bJmp[1];
DWORD dwTestSaveFunc = *(LPDWORD)&lpTestSaveFunc->bJmp[1];
int nSize = dwEndTest - dwTestSaveFunc;
DWORD lpTestSaveFuncAdress = dwTestSaveFunc + (DWORD)TestSaveFunc + sizeof(JMPCALLSTRUCT);
if(MyFile.Open(Path,CFile::modeCreate|CFile::modeReadWrite))
{
MyFile.Write((BYTE *)&lpTestSaveFuncAdress,nSize);
MyFile.Close();
}}
MyFile.Write((BYTE *)&lpTestSaveFuncAdress,nSize);
==>
MyFile.Write((BYTE *)lpTestSaveFuncAdress,nSize);