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();
}
}

解决方案 »

  1.   

    (DWORD)&EndTest-(DWORD)&TestSaveFunc这是啥意思?
      

  2.   

    在你的这段代码里这样是不行的,因为通常情况下,
    这段代码里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();
    }}
      

  3.   

    晕写太快了 纠正:
    MyFile.Write((BYTE *)&lpTestSaveFuncAdress,nSize);
    ==>
    MyFile.Write((BYTE *)lpTestSaveFuncAdress,nSize);