📄 array.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 + -