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

📄 array.cpp

📁 《精通matlab与c++混合编程》的光盘内容
💻 CPP
字号:
// array.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
//#include "comutil.h"
//#include "mwutil.h"
#include "mwcomutil.h"
#import "D:\MATLAB6p5p1\bin\win32\mwcomutil.dll" raw_interfaces_only
#include "arraypasscom_1_0.h"
#include "COMDEF.H"
// 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;
    }
}
//interface 
int main(int argc, char* argv[])
{
	// Initialize COM
    if ((FAILED(CoInitialize(NULL))))
    {
        printf("CoInitialize failed.\n");
        exit(1);
    }

	SAFEARRAY FAR * pa1=NULL;
	SAFEARRAY FAR * pa2=NULL;	
	SAFEARRAYBOUND bound1[1]={{10,0}};
	SAFEARRAYBOUND bound2[2]={{5,0},{5,0}};
	pa1=SafeArrayCreate(VT_I4,1,bound1);
	pa2=SafeArrayCreate(VT_R8,2,bound2);	

	int i=0,j=0;	
	int * x=NULL;
	double *y=NULL;
	HRESULT hr;
	hr=SafeArrayAccessData(pa1,(void **)&x);
	if(FAILED(hr))
	{
		return false;
	}
	for(i=0;i<10;i++)
	{
		x[i]=i;
	}	
	SafeArrayUnaccessData(pa1);

	x=NULL;

	hr=SafeArrayAccessData(pa2,(void **)&y);
	if(FAILED(hr))
	{
		return false;
	}
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			y[i*5+j]=i+j;
		}
	}
	
	SafeArrayUnaccessData(pa2);

	VARIANT varArray1,varArray2,varOutArray;
	VariantInit(&varArray1);
	VariantInit(&varArray2);
	VariantInit(&varOutArray);
	varArray1.vt=VT_I4|VT_ARRAY;
	varArray1.parray=pa1;
	varArray2.vt=VT_R8|VT_ARRAY;
	varArray2.parray=pa2;

	Iarraypasscom * pArrayPasscom=NULL;
	hr=CoCreateInstance(CLSID_arraypasscom,NULL,CLSCTX_ALL,IID_Iarraypasscom,(void**)&pArrayPasscom);
	if(FAILED(hr))
	{
		return false;
	}
	printf("整型一维数组varArray1\n");
	pArrayPasscom->displayarray(varArray1);
	
	//IMWFlags * pFlags=NULL;
	//pArrayPasscom->get_MWFlags(&pFlags);
	MWComUtil::IMWFlagsPtr pFlags=NULL;
	MWComUtil::IMWDataConversionFlagsPtr pConversionFlags=NULL;
	pFlags.CreateInstance(__uuidof(MWComUtil::MWFlags));
	pFlags->get_DataConversionFlags(&pConversionFlags);
	//pConversionFlags.CreateInstance(__uuidof(MWComUtil::MWDataConversionFlags));
	mwDataType dataConverType;
	dataConverType=mwTypeDouble;
	pConversionFlags->put_CoerceNumericToType(dataConverType);
	IMWFlags * pIFlags=NULL;
	pFlags->QueryInterface(&pIFlags);
	//pFlags->put_DataConversionFlags(
	pArrayPasscom->put_MWFlags(pIFlags);	
	
	hr=pArrayPasscom->addarray(1,&varOutArray,varArray1);
	if(FAILED(hr))
	{

        IUnknown* pUnk = NULL;
        hr = pArrayPasscom ->QueryInterface(IID_IUnknown, (void**)&pUnk);
        if (SUCCEEDED(hr))
        {
            ShowCOMError(pUnk, __uuidof(Iarraypasscom));
            pUnk->Release();
        }
        //pArrayPasscom = NULL;
   
		//return false;
	}
	printf("整型一维数组varArray1加1\n");
	pArrayPasscom->displayarray(varOutArray);
	printf("double型二维数组varArray2\n");
	pArrayPasscom->displayarray(varArray2);
	printf("整型一维数组varArray2加1\n");
	pArrayPasscom->addarray(1,&varOutArray,varArray2);
	pArrayPasscom->displayarray(varOutArray);

	//pArrayPasscom->Release();
	//pFlags.Release();
	//pIFlags->Release();
	pConversionFlags=NULL;
	pFlags=NULL;

	SafeArrayDestroy(pa1);
	SafeArrayDestroy(pa2);

	CoUninitialize();
	return 0;
}

⌨️ 快捷键说明

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