📄 test.cpp
字号:
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "test.h"
#include "afxdisp.h"
#include "mwcomutil.h"
#include "structcombinecom_1_0.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
#import "D:\MATLAB6p5p1\bin\win32\mwcomutil.dll" raw_interfaces_only
#import "structfiles\distrib\structfiles_1_0.dll" raw_interfaces_only
using namespace structfiles;
// Retrieves a COM error from an object and prints a discriptive message
// to STDOUT contianing the error's source and message.
void ShowCOMError(IUnknown* pUnk, REFIID iid)
{
ISupportErrorInfo* pSupportErrorInfo = NULL;
IErrorInfo* pErrorInfo = NULL;
HRESULT hr = S_OK;
wchar_t szTemp[128];
_bstr_t bstrMessage = _bstr_t("");
if (pUnk == NULL)
return;
if (SUCCEEDED(pUnk->QueryInterface(IID_ISupportErrorInfo, (void**)&pSupportErrorInfo)))
{
if (pSupportErrorInfo->InterfaceSupportsErrorInfo(iid) == S_OK)
{
GetErrorInfo(0, &pErrorInfo);
BSTR bstrDesc;
BSTR bstrSource;
pErrorInfo->GetDescription(&bstrDesc);
pErrorInfo->GetSource(&bstrSource);
swprintf(szTemp, L"Error: 0x%08x", hr);
bstrMessage += szTemp;
bstrMessage += " Source: ";
bstrMessage += _bstr_t(bstrSource);
bstrMessage += " Description: ";
bstrMessage += _bstr_t(bstrDesc);
printf("%s\n", (char*)bstrMessage);
if (bstrDesc != NULL)
SysFreeString(bstrDesc);
if (bstrSource != NULL)
SysFreeString(bstrSource);
pErrorInfo->Release();
pErrorInfo = NULL;
}
pSupportErrorInfo->Release();
pSupportErrorInfo = NULL;
}
}
// Creates a 1-Dim Variant array of type VT_I4 with the
// values dim[0] = m and dim[1] = n. Returns S_OK on success.
HRESULT GetDimsArray(int m, int n, VARIANT& var)
{
int* pv = NULL;
if (m < 1 || n < 1)
{
printf("Invalid dimensions\n");
return E_FAIL;
}
SAFEARRAYBOUND rgsabound[1] = {{2,1}};
SAFEARRAY* psa = SafeArrayCreate(VT_I4, 1, rgsabound);
if (psa == NULL)
{
printf("Error creating safearray\n");
return E_FAIL;
}
if (FAILED(SafeArrayAccessData(psa, (void**)&pv)))
{
SafeArrayDestroy(psa);
printf("Error accessing safearray\n");
return E_FAIL;
}
pv[0] = m;
pv[1] = n;
SafeArrayUnaccessData(psa);
var.vt = VT_I4|VT_ARRAY;
var.parray = psa;
return S_OK;
}
// Creates a 1-Dim Variant array of type VT_BSTR with strings
// supplied in the FieldNames array. Returns S_OK on success.
HRESULT GetFieldNamesArray(int nFields, const OLECHAR** FieldNames, VARIANT& var)
{
BSTR* pv = NULL;
if (nFields < 0)
{
printf("Invalid number of fields\n");
return E_FAIL;
}
SAFEARRAYBOUND rgsabound[1] = {{nFields,1}};
SAFEARRAY* psa = SafeArrayCreate(VT_BSTR, 1, rgsabound);
if (psa == NULL)
{
printf("Error creating safearray\n");
return E_FAIL;
}
if (FAILED(SafeArrayAccessData(psa, (void**)&pv)))
{
SafeArrayDestroy(psa);
printf("Error accessing safearray\n");
return E_FAIL;
}
for (int i=0; i<nFields; i++)
{
pv[i] = SysAllocString(FieldNames[i]);
}
SafeArrayUnaccessData(psa);
var.vt = VT_BSTR|VT_ARRAY;
var.parray = psa;
return S_OK;
}
// Creates a 1X1 stuct array from a list of fieldnames and values.
// The ith field is assigned the ith value, i.e. p.(FieldNames[i]) = values[i]
// The MWStruct passed in must be pre-instantiated. The FieldNames and values
// arrays must be at least nFields long. Returns S_OK on success.
HRESULT CreateStruct(MWComUtil::IMWStructPtr& pStruct, int nFields, const OLECHAR** FieldNames, const VARIANT* values)
{
MWComUtil::IMWField* pField = NULL;
HRESULT hr = S_OK;
VARIANT varMissing;
VARIANT varDims;
VARIANT varFields;
VARIANT varFieldName;
int i = 0;
// Initialize temp variables
VariantInit(&varDims);
VariantInit(&varFields);
VariantInit(&varMissing);
VariantInit(&varFieldName);
varMissing.vt = VT_ERROR;
varMissing.scode = DISP_E_PARAMNOTFOUND;
// Create dims array
if (FAILED((hr = GetDimsArray(1, 1, varDims))))
goto EXIT;
// Create field names array
if (FAILED((hr = GetFieldNamesArray(nFields, FieldNames, varFields))))
goto EXIT;
hr = pStruct->Initialize(varDims, varFields);
if (FAILED(hr))
{
printf("Initialize struct failed.\n");
goto EXIT;
}
for (i=0; i<nFields; i++)
{
varFieldName.vt = VT_BSTR;
varFieldName.bstrVal = SysAllocString(FieldNames[i]);
hr = pStruct->get_Item(varFieldName, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing,
varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing,
varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing,
varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing,
&pField);
pField->put_Value(values[i]);
pField->Release();
pField = NULL;
VariantClear(&varFieldName);
}
EXIT:
// Clean up
VariantClear(&varDims);
VariantClear(&varFields);
VariantClear(&varFields);
VariantClear(&varFieldName);
if (pField != NULL)
pField->Release();
return hr;
}
HRESULT CreateStruct1(IMWStruct * pStruct, int nFields, const OLECHAR** FieldNames, const VARIANT* values)
{
IMWField* pField = NULL;
HRESULT hr = S_OK;
VARIANT varMissing;
VARIANT varDims;
VARIANT varFields;
VARIANT varFieldName;
VARIANT varField1;
VariantInit(&varField1);
varField1.vt=VT_DISPATCH;
int i = 0;
// Initialize temp variables
VariantInit(&varDims);
VariantInit(&varFields);
VariantInit(&varMissing);
VariantInit(&varFieldName);
varMissing.vt = VT_ERROR;
varMissing.scode = DISP_E_PARAMNOTFOUND;
// Create dims array
if (FAILED((hr = GetDimsArray(1, 1, varDims))))
goto EXIT;
// Create field names array
if (FAILED((hr = GetFieldNamesArray(nFields, FieldNames, varFields))))
goto EXIT;
pStruct->Initialize(varDims, varFields);
/*if (FAILED(hr))
{
printf("Initialize struct failed.\n");
goto EXIT;
}*/
//pField->CreateDispatch(
IDispatch * pField;
for (i=0; i<nFields; i++)
{
varFieldName.vt = VT_BSTR;
varFieldName.bstrVal = SysAllocString(FieldNames[i]);
pField = pStruct->GetItem(varFieldName, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing,
varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing,
varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing,
varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing, varMissing);
pField->SetValue(values[i]);
pField = NULL;
VariantClear(&varFieldName);
}
EXIT:
// Clean up
VariantClear(&varDims);
VariantClear(&varFields);
VariantClear(&varFields);
VariantClear(&varFieldName);
if (pField != NULL)
pField->Release();
return hr;
}
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
CoInitialize(NULL);
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
}
IMWStruct structIn1;
IMWStruct structIn2;
IMWStruct sturctOut;
//MWStruct struct2;
//structIn1.Initialize();
Istructcombinecom * pStructCombineCom=NULL;
HRESULT hr;
hr=CoCreateInstance(CLSID_structcombinecom,NULL,
CLSCTX_ALL,IID_Istructcombinecom,(void**)&pStructCombineCom);
if(FAILED(hr))
{
printf("ERROR");
void * pMsgBuf;
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
hr,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPTSTR)&pMsgBuf,
0,
NULL);
cout <<"Error("<<hex<<hr<<"):"
<<(LPTSTR)pMsgBuf<<endl;
//Free
LocalFree(pMsgBuf);
return 0;
}
COleVariant varIn1;
COleVariant varIn2;
COleVariant varOut;
varIn1.vt=VT_DISPATCH;
varIn1.pdispVal=structIn1.m_lpDispatch;
OLECHAR* FieldNames1[3] = {L"a", L"b", L"c"};
BSTR FieldNames2[3]={L"a",L"b",L"c"};
CoUninitialize();
return nRetCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -