⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.cpp

📁 《精通matlab与c++混合编程》的光盘内容
💻 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 + -