📄 winmergescript.cpp
字号:
// WinMergeScript.cpp : Implementation of CWinMergeScript
#include "stdafx.h"
#include "DisplayBinaryFiles.h"
#include "WinMergeScript.h"
#include "unicheck.h"
#include <fstream>
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// CWinMergeScript
STDMETHODIMP CWinMergeScript::get_PluginEvent(BSTR *pVal)
{
*pVal = SysAllocString(L"FILE_PACK_UNPACK");
return S_OK;
}
STDMETHODIMP CWinMergeScript::get_PluginDescription(BSTR *pVal)
{
*pVal = SysAllocString(L"Transform a binary file so WinMerge can display it - save not possible");
return S_OK;
}
STDMETHODIMP CWinMergeScript::get_PluginFileFilters(BSTR *pVal)
{
*pVal = SysAllocString(L"\\.exe$;\\.dll$;\\.ocx$");
return S_OK;
}
STDMETHODIMP CWinMergeScript::get_PluginIsAutomatic(VARIANT_BOOL *pVal)
{
*pVal = VARIANT_TRUE;
return S_OK;
}
STDMETHODIMP CWinMergeScript::UnpackBufferA(SAFEARRAY **pBuffer, INT *pSize, VARIANT_BOOL *pbChanged, INT *pSubcode, VARIANT_BOOL *pbSuccess)
{
// We don't need it
return S_OK;
}
STDMETHODIMP CWinMergeScript::PackBufferA(SAFEARRAY **pBuffer, INT *pSize, VARIANT_BOOL *pbChanged, INT subcode, VARIANT_BOOL *pbSuccess)
{
// We don't need it
return S_OK;
}
STDMETHODIMP CWinMergeScript::UnpackFile(BSTR fileSrc, BSTR fileDst, VARIANT_BOOL *pbChanged, INT *pSubcode, VARIANT_BOOL *pbSuccess)
{
USES_CONVERSION;
ifstream input(W2T(fileSrc), ios::in | ios::binary);
ofstream output(W2T(fileDst), ios::out | ios::binary);
input.seekg(0L, ios::end);
int len = input.tellg();
input.seekg(0L, ios::beg);
char buffer[65536];
bool beginning=true;
// Check for Unicode BOM (byte order mark)
// Only matter if file has 3 or more bytes
// Files with <3 bytes are empty if they are UCS-2
unicodingInfo uninfo;
while (len)
{
int curlen = len;
if (curlen > 65536)
curlen = 65536;
// align on 4byte boundary, in case doing unicode encoding
if (curlen > 4 && ( (curlen % 4) != 0))
curlen -= (curlen % 4);
input.read(buffer, curlen);
int i=0;
if (beginning)
{
if (CheckForBom(buffer, curlen, &uninfo))
i += uninfo.bom_width;
beginning = false;
}
for ( ; i < curlen ; i += uninfo.char_width)
{
int index = i+uninfo.low_byte;
if (i+index < curlen && buffer[index] == 0)
{
buffer[index] = 0x20;
}
}
output.write(buffer, curlen);
len -= curlen;
}
input.close();
output.close();
*pbChanged = VARIANT_TRUE;
*pbSuccess = VARIANT_TRUE;
return S_OK;
}
STDMETHODIMP CWinMergeScript::PackFile(BSTR fileSrc, BSTR fileDst, VARIANT_BOOL *pbChanged, INT pSubcode, VARIANT_BOOL *pbSuccess)
{
// always return error so the users knows we can not repack
*pbChanged = VARIANT_FALSE;
*pbSuccess = VARIANT_FALSE;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -