实现程序合并和分解

原创 2016年08月29日 00:10:36

1.前言

公司需要实现我们的程序和客户的程序合并成一个,且要先运行我们的,客户的才能正确运行。所以需要做一个简单的类似于安装包一样的东东。

2.解决

有很多方法,这里提供两种:

2.1 可以将客户的程序作为我们程序的一个资源来实现合并和释放

合并代码片段

void merge()
{
    HANDLE hUpdateRes; 
    hUpdateRes = BeginUpdateResource(strDesPath.c_str(), FALSE);
    if (hUpdateRes != NULL)
    {
        HANDLE hOpenFile = (HANDLE)CreateFile(wstrloginpath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
        if (hOpenFile != INVALID_HANDLE_VALUE)
        {
            DWORD fileSize = GetFileSize(hOpenFile, NULL);
            char *pBuffer = (char *) malloc(fileSize + 1);     //这里可能会失败
            DWORD RSize = 0;
            ReadFile(hOpenFile, pBuffer, fileSize, &RSize, NULL);

            BOOL result = UpdateResource(hUpdateRes,   
                TEXT("FILE"),                        
                TEXT("ALACLIENT"),       
                MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
                (char *)pBuffer,                        
                fileSize);  //fileSize + 5
            if (!result)
                writelog("failed UpdateResource exe in generatefunc");

            CloseHandle(hOpenFile);
            free(pBuffer);
        }
        EndUpdateResource(hUpdateRes, FALSE);
    }
}

分解代码片段

void splite()
{
    HRSRC hrSrc;
    HGLOBAL hGlobal;
    LPVOID lpExe;
    DWORD dwSize;
    HANDLE hFile;

    hrSrc = FindResource(NULL, TEXT("ALACLIENT"), TEXT("FILE"));
    hGlobal = LoadResource(NULL, hrSrc);
    lpExe = LockResource(hGlobal);
    dwSize = SizeofResource(NULL, hrSrc);
    hFile = CreateFile(
        strLoginPath.c_str(),
        GENERIC_ALL,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        DWORD dwBytesWritten = 0;
        if(WriteFile(hFile,lpExe, dwSize, &dwBytesWritten,NULL)==FALSE)
        {
            //这里进行下解密
        }
        CloseHandle(hFile);
    }
    UnlockResource(hGlobal);
    FreeResource(hGlobal);
}

2.2 可以将客户的程序合并到我们的程序后面

合并部分代码片段

void merge()
{
    DWORD dwSrcLen = 0;
    HANDLE hAppend = CreateFile(strDesPath.c_str(),  // open Two.txt
        FILE_APPEND_DATA,         // open for writing
        FILE_SHARE_READ,          // allow multiple readers
        NULL,                     // no security
        OPEN_ALWAYS,              // open or create
        FILE_ATTRIBUTE_NORMAL,    // normal file
        NULL);                    // no attr. template

    if (hAppend == INVALID_HANDLE_VALUE)
    {
        //printf("Could not open Two.txt.");
        writelog("failed open despath.");
        MessageBox(NULL, TEXT("生成失败,请重新封装"), TEXT("提示"), 0);
        CloseHandle(hAppend);
        hAppend = INVALID_HANDLE_VALUE;
        return;
    }
    else
        dwSrcLen = GetFileSize(hAppend, NULL);


    HANDLE hFileZip = CreateFile(wstrZipPath.c_str(),  // open One.txt
        GENERIC_READ,             // open for reading
        0,                        // do not share
        NULL,                     // no security
        OPEN_EXISTING,            // existing file only
        FILE_ATTRIBUTE_NORMAL,    // normal file
        NULL);                    // no attr. template

    if (hFileZip != INVALID_HANDLE_VALUE)
    {
        DWORD dwBytesRead = sizeof(DWORD), dwBytesWritten = 0;
        DWORD dwFileLen = GetFileSize(hFileZip, NULL);
        DWORD dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
        BYTE   buff[4096] = {0};

        LockFile(hAppend, dwPos, 0, dwBytesRead, 0);
        WriteFile(hAppend, &dwFileLen, sizeof(DWORD), &dwBytesWritten, NULL);
        UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);

        while (ReadFile(hFileZip, buff, sizeof(buff), &dwBytesRead, NULL)
            && dwBytesRead > 0)
        {
            dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
            LockFile(hAppend, dwPos, 0, dwBytesRead, 0);
            WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL);
            UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
        }
        CloseHandle(hFileZip);
        hFileZip = INVALID_HANDLE_VALUE;


        dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
        dwBytesRead = sizeof(DWORD);
        LockFile(hAppend, dwPos, 0, dwBytesRead, 0);
        WriteFile(hAppend, &dwSrcLen, sizeof(DWORD), &dwBytesWritten, NULL);
        UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
    }
    else
    {
        MessageBox(NULL, TEXT("生成失败,请重新进行生成."), TEXT("提示"), 0);
        CloseHandle(hAppend);
        hAppend = INVALID_HANDLE_VALUE;
        return;
    }
    CloseHandle(hAppend);
    hAppend = INVALID_HANDLE_VALUE;
}

分解部分代码片段

void splite()
{
    hFile = CreateFile(ptExePath, // open One.txt
        GENERIC_READ,             // open for reading
        0,                        // do not share
        NULL,                     // no security
        OPEN_EXISTING,            // existing file only
        FILE_ATTRIBUTE_NORMAL,    // normal file
        NULL);                    // no attr. template
    if (hFile == INVALID_HANDLE_VALUE)
        break;
    SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
    dwFileLen = GetFileSize(hFile, NULL);

    //LONG lPos = -sizeof(DWORD);
    dwPos = SetFilePointer(hFile, -sizeof(DWORD), NULL, FILE_END);
    ReadFile(hFile, &snAlaPackLen, sizeof(DWORD), &dwBytesRead, NULL);

    //这里进行对数据提取cloud文件.
    if (snAlaPackLen < 100 || snAlaPackLen > dwFileLen)
        break;

    SetFilePointer(hFile, snAlaPackLen, NULL, FILE_BEGIN);
    if (snAlaPackLen + sizeof(DWORD) > dwFileLen)
        break;

    DWORD dwCloud = 0;
    ReadFile(hFile, &dwCloud, sizeof(DWORD), &dwBytesRead, NULL);
    if (snAlaPackLen + sizeof(DWORD) + dwCloud > dwFileLen)
        break;

    DWORD dwCount = dwCloud / sizeof(buff);
    DWORD dwValue = dwCloud % sizeof(buff);
    hFileZip = CreateFile(wstrTempZipPath.c_str(), // open Two.txt
        FILE_APPEND_DATA,         // open for writing
        FILE_SHARE_READ,          // allow multiple readers
        NULL,                     // no security
        OPEN_ALWAYS,              // open or create
        FILE_ATTRIBUTE_NORMAL,    // normal file
        NULL);                    // no attr. template
    if (hFileZip == INVALID_HANDLE_VALUE)
        break;

    for (DWORD dwIndex = 0; dwIndex < dwCount; ++dwIndex)
    {
        if (ReadFile(hFile, buff, sizeof(buff), &dwBytesRead, NULL) && dwBytesRead > 0)
        {
            dwPos = SetFilePointer(hFileZip, 0, NULL, FILE_END);
            LockFile(hFileZip, dwPos, 0, dwBytesRead, 0);
            WriteFile(hFileZip, buff, dwBytesRead, &dwBytesWritten, NULL);
            UnlockFile(hFileZip, dwPos, 0, dwBytesRead, 0);
        }
    }
    if (dwValue > 0)
    {
        if (ReadFile(hFile, buff, dwValue, &dwBytesRead, NULL) && dwBytesRead > 0)
        {
            dwPos = SetFilePointer(hFileZip, 0, NULL, FILE_END);
            LockFile(hFileZip, dwPos, 0, dwBytesRead, 0);
            WriteFile(hFileZip, buff, dwBytesRead, &dwBytesWritten, NULL);
            UnlockFile(hFileZip, dwPos, 0, dwBytesRead, 0);
        }
    }
    CloseHandle(hFileZip);
    hFileZip = INVALID_HANDLE_VALUE;
    CloseHandle(hFile);
    hFile = INVALID_HANDLE_VALUE;
}

3.备注

这里解释下第二种方法,因为无法将程序大小添加到文件头部,故将其添加到程序的尾部

MFC中如何将两个独立的程序合并为一个程序(障眼法)

今天一个同学叫我帮忙解决一个关于MFC的问题,问题为:“将两个独立的MFC程序合并为一个程序 ”。...
  • rl529014
  • rl529014
  • 2016年05月19日 22:17
  • 3050

实现程序合并和分解

实现程序合并和分解的两种方法1.资源 2.尾追加
  • zhang_ruiqiang
  • zhang_ruiqiang
  • 2016年08月29日 00:10
  • 518

c++ 合并文件以及拆分

昨天看到一篇介绍TFS的文章,大意是为了处理海量图片,采用分布式架构,将小图片合并为大的文件         兴趣驱使下,写了一个简单的文件合并拆分程序             合并的方法很简单...
  • KWSY2008
  • KWSY2008
  • 2015年03月19日 21:40
  • 4601

彻底理解谓词推入的利弊

谓词推入(PUSHING PREDICATE): create or replace view vtest as select * from test1 where object_id>1000; ...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2017年05月03日 18:05
  • 184

整数合并和拆分

#define MAKEULONGLONG(a,b)   ((ULONGLONG)(((ULONG)((ULONGLONG)(a) & 0xffffffff)) | ((ULONGLONG)((ULO...
  • xuxinhua
  • xuxinhua
  • 2011年04月04日 11:11
  • 1636

文件合并与分解,文件比较

  • 2008年09月16日 15:05
  • 168KB
  • 下载

JAVA写的文件分割与文件合并程序

JAVA写的文件分割与文件合并程序  原来觉得文件的切割与合并好神秘,觉得能够写这样程序的人简直就是高手、老鸟之类的人了,呵呵。  现在我自己这么一写,才觉得是如此之简单,连我这都菜鸟都能够写(不过,...
  • dongliheng
  • dongliheng
  • 2007年07月15日 01:13
  • 2486

Git协作注意合并和衍合的区别,just避雷

Git是团队协作开发的神兵利器,它最强势的地方是让我们可以极其快速的创建、切换代码分支。开发新功能了,从主干上切一个Feature分支,开发到一半正准备去厕所划个水,测试过来提了一个主干代码上的闪退B...
  • TripleS_X
  • TripleS_X
  • 2018年01月15日 17:18
  • 52

二维数组合并和排序

代码: /** 作者:一叶扁舟 时间:23:56 2016/8/26 作用:将一个一维数组和一个二维数组的数据合并,并排序 ***/ #include "stdio.h" #include "std...
  • u011662320
  • u011662320
  • 2016年08月27日 23:18
  • 348

一个c#编写的简单的文件分割和文件合并的程序

  • 2017年06月21日 14:33
  • 65KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现程序合并和分解
举报原因:
原因补充:

(最多只允许输入30个字)