dllexports.cpp

来自「由7-zip提供的压缩、解压缩程序」· C++ 代码 · 共 153 行

CPP
153
字号
// DLLExports.cpp#include "StdAfx.h"#include "Common/MyInitGuid.h"#include "Common/ComTry.h"#include "x86.h"#include "PPC.h"#include "IA64.h"#include "ARM.h"#include "ARMThumb.h"#include "x86_2.h"#include "SPARC.h"#define MY_CreateClass0(n) \if (*clsid == CLSID_CCompressConvert ## n ## _Encoder) { \    if (!correctInterface) \      return E_NOINTERFACE; \    filter = (ICompressFilter *)new C ## n ## _Encoder(); \  } else if (*clsid == CLSID_CCompressConvert ## n ## _Decoder){ \    if (!correctInterface) \      return E_NOINTERFACE; \    filter = (ICompressFilter *)new C ## n ## _Decoder(); \  }extern "C"DLLEXPORT BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/){	return TRUE;}STDAPI CreateObject(    const GUID *clsid,     const GUID *interfaceID,     void **outObject){  COM_TRY_BEGIN  *outObject = 0;  int correctInterface = (*interfaceID == IID_ICompressFilter);  CMyComPtr<ICompressFilter> filter;  MY_CreateClass0(BCJ_x86)  else  MY_CreateClass0(BC_ARM)  else  MY_CreateClass0(BC_PPC_B)  else  MY_CreateClass0(BC_IA64)  else  MY_CreateClass0(BC_ARMThumb)  else  MY_CreateClass0(BC_SPARC)  else  {    CMyComPtr<ICompressCoder2> coder2;    correctInterface = (*interfaceID == IID_ICompressCoder2);    if (*clsid == CLSID_CCompressConvertBCJ2_x86_Encoder)    {      if (!correctInterface)        return E_NOINTERFACE;      coder2 = (ICompressCoder2 *)new CBCJ2_x86_Encoder();    }    else if (*clsid == CLSID_CCompressConvertBCJ2_x86_Decoder)    {      if (!correctInterface)        return E_NOINTERFACE;      coder2 = (ICompressCoder2 *)new CBCJ2_x86_Decoder();    }    else      return CLASS_E_CLASSNOTAVAILABLE;    *outObject = coder2.Detach();    return S_OK;  }  *outObject = filter.Detach();  return S_OK;  COM_TRY_END}struct CBranchMethodItem{  char ID[4];  const wchar_t *UserName;  const GUID *Decoder;  const GUID *Encoder;  UINT32 NumInStreams;};#define METHOD_ITEM(Name, id, subId, UserName, NumInStreams) \  { { 0x03, 0x03, id, subId }, UserName, \  &CLSID_CCompressConvert ## Name ## _Decoder, \  &CLSID_CCompressConvert ## Name ## _Encoder, NumInStreams }static CBranchMethodItem g_Methods[] ={  METHOD_ITEM(BCJ_x86,  0x01, 0x03, L"BCJ", 1),  METHOD_ITEM(BCJ2_x86, 0x01, 0x1B, L"BCJ2", 4),  METHOD_ITEM(BC_PPC_B, 0x02, 0x05, L"BC_PPC_B", 1),  // METHOD_ITEM(BC_Alpha, 0x03, 1, L"BC_Alpha", 1),  METHOD_ITEM(BC_IA64,  0x04, 1, L"BC_IA64", 1),  METHOD_ITEM(BC_ARM,   0x05, 1, L"BC_ARM", 1),  // METHOD_ITEM(BC_M68_B, 0x06, 5, L"BC_M68_B", 1),  METHOD_ITEM(BC_ARMThumb, 0x07, 1, L"BC_ARMThumb", 1),  METHOD_ITEM(BC_SPARC, 0x08, 0x05, L"BC_SPARC", 1)};STDAPI GetNumberOfMethods(UINT32 *numMethods){  *numMethods = sizeof(g_Methods) / sizeof(g_Methods[1]);  return S_OK;}STDAPI GetMethodProperty(UINT32 index, PROPID propID, PROPVARIANT *value){  if (index > sizeof(g_Methods) / sizeof(g_Methods[1]))    return E_INVALIDARG;  VariantClear((tagVARIANT *)value);  const CBranchMethodItem &method = g_Methods[index];  switch(propID)  {    case NMethodPropID::kID:      if ((value->bstrVal = ::SysAllocStringByteLen(method.ID,           sizeof(method.ID))) != 0)        value->vt = VT_BSTR;      return S_OK;    case NMethodPropID::kName:      if ((value->bstrVal = ::SysAllocString(method.UserName)) != 0)        value->vt = VT_BSTR;      return S_OK;    case NMethodPropID::kDecoder:      if ((value->bstrVal = ::SysAllocStringByteLen(          (const char *)method.Decoder, sizeof(GUID))) != 0)        value->vt = VT_BSTR;      return S_OK;    case NMethodPropID::kEncoder:      if ((value->bstrVal = ::SysAllocStringByteLen(          (const char *)method.Encoder, sizeof(GUID))) != 0)        value->vt = VT_BSTR;      return S_OK;    case NMethodPropID::kInStreams:    {      if (method.NumInStreams != 1)      {        value->vt = VT_UI4;        value->ulVal = method.NumInStreams;      }      return S_OK;    }  }  return S_OK;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?