addin.cpp

来自「一个以前收集的基于C/S架构的ERP客户端源代码」· C++ 代码 · 共 149 行

CPP
149
字号
#include <windows.h>
#include "addin.h"
#include "FinReport.h"
//////////////////////////////////////////////////////////////////////////////
// These strings provide the name and description of the add-in.  The L beside
// the left quote causes the compiler to generate a Unicode string (i.e., it
// is a short array instead of a char array).
//
#define F1AddInName L"Sderp Finance Report Add-In"
#define F1AddInDesc L"Sderp finance report Add-In with Formula One 6 by Lu, only useful with sderp"
HRESULT MakeErrorResult(LPVARIANTARG pResult, HRESULT hrEval = S_OK)
{
    if (hrEval)
    {
    	if(SUCCEEDED(::VariantClear(pResult)))
    	{
            pResult->vt = VT_ERROR;
    	    pResult->scode = hrEval;
	}
	else
	    return E_OUTOFMEMORY;
    }
    return S_OK;
}
inline HRESULT CheckReturnValue(HRESULT hr)
{
    return FAILED(hr) ? E_OUTOFMEMORY : S_OK;
}
HRESULT CALLBACK FinData(
		LPVARIANTARG pResult,	// Pointer to the VARIANT receiving the
		int,					// Ignore this argument; it's reserved for
		int nArgs,				// Number of arguments
		LPVARIANTARG pArgs)		// Pointer to an array of nArgs VARIANTs, each
{
    if(nArgs == 3 || nArgs == 4)
    {
        try{
           AnsiString Glkm;
           AnsiString Period;
           AnsiString Type;
           AnsiString PerInc;

           switch(pArgs[0].vt)
           {
              case VT_R8:
                  Glkm = IntToStr((__int64)pArgs[0].dblVal);
                  break;
              case VT_BSTR:
                  Glkm = AnsiString(WideString(pArgs[0].bstrVal));
                  break;
           }
           Period = AnsiString(WideString(pArgs[1].bstrVal));
           Type = AnsiString(WideString(pArgs[2].bstrVal));
           switch(pArgs[3].vt)
           {
              case VT_R8:
                  PerInc = IntToStr((__int64)pArgs[3].dblVal);
                  break;
              case VT_BSTR:
                  PerInc = AnsiString(WideString(pArgs[3].bstrVal));
                  break;
           }
           pResult[0].vt = VT_R8;
           pResult[0].dblVal = StrToFloat(frmFinReport->FinData(Glkm, Period, Type, PerInc));
           return S_OK;
        }catch(...)
        {
           return ::MakeErrorResult(pResult, F1_E_VALUE);
        }
    }
    return ::MakeErrorResult(pResult, F1_E_VALUE);
}
HRESULT CALLBACK KmName(
		LPVARIANTARG pResult,	// Pointer to the VARIANT receiving the
		int,					// Ignore this argument; it's reserved for
		int nArgs,				// Number of arguments
		LPVARIANTARG pArgs)		// Pointer to an array of nArgs VARIANTs, each
{
    if(nArgs == 1)
    {
        AnsiString Glkm;
        try{
           switch(pArgs[0].vt)
           {
              case VT_R8:
                 Glkm = IntToStr((__int64)pArgs[0].dblVal);
                 break;
              case VT_BSTR:
                 Glkm = AnsiString(WideString(pArgs[0].bstrVal));
                 break;
           }
           pResult[0].vt = VT_BSTR;
           pResult[0].bstrVal = WideString(frmFinReport->KmName(Glkm));
           return S_OK;
        }catch(...)
        {
           return ::MakeErrorResult(pResult, F1_E_VALUE);
        }
    }
    return ::MakeErrorResult(pResult, F1_E_VALUE);
}
//////////////////////////////////////////////////////////////////////////////
// F1AddInInit
//
// This exported function (see AddIn.def) registers the add-in's functions and
// other general information with Formula One.  Formula One calls this
// function when it loads the add-in.
extern "C" HRESULT __stdcall F1AddInInit(
		F1AddInRegisterInfoProc		RegisterInfoProc,
		F1AddInRegisterFunctionProc	RegisterFunctionProc,
		int,
		int)
{
    HRESULT hr = S_OK;
    if(SUCCEEDED(hr))
    	hr = RegisterFunctionProc(
    		L"财务数据",
    		0,
    		FinData,
    		-1);
    if(SUCCEEDED(hr))
    	hr = RegisterFunctionProc(
    		L"cwsj",
    		0,
    		FinData,
    		-1);
    if(SUCCEEDED(hr))
    	hr = RegisterFunctionProc(
    		L"科目名称",
    		0,
    		KmName,
    		1);
    if(SUCCEEDED(hr))
    	hr = RegisterFunctionProc(
    		L"kmmc",
    		0,
    		KmName,
    		1);
    if (SUCCEEDED(hr))
    	hr = RegisterInfoProc(
    		F1AddInName,// Name of the add-in (defined at top of the file)
    		F1AddInDesc,// Description of the add-in
    		0,			// Reserved for future use; must be 0
    		0);			// Reserved for future use; must be 0
    return hr;
}


⌨️ 快捷键说明

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