?? command.cpp
字號:
// commanf.cpp: implementation of the commanf class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "richtest.h"
#include "command.h"
#include "mydata.h"
//#include "mclcomclass.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IID EMPTY_IID={0,0,0,{0,0,0,0,0,0,0,0}};
const IID IID_IMWFlags = {0x0A295776,0x23A1,0x410a,{0x94,0xBD,0x0C,0x6C,0x61,0xB8,0x91,0xB7}};
const CLSID CLSID_MWFlags = {0x02730550,0xC3E2,0x4a60,{0xBA,0x7B,0x9A,0xBC,0xD4,0x81,0x25,0x0D}};
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int invoke(IDispatch*,disp_conector*,int,VARIANT*, VARIANT*);
#define DISP_BASE 7
IMPLEMENT_SERIAL(command,CObject,1);
HRESULT __stdcall get_MWFlags(IMWFlags** ppFlags);
tagconector::tagconector()
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
function_name=NULL;//接口名稱
function_length=0;//接口名稱長度
description=NULL;//接口描述
description_length=0;//接口描述長度
xxx=FALSE;
in_param_cnt=1;//輸入參數數量
out_param_cnt=1;//輸出參數數量
};
tagconector::~tagconector()
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(!xxx)
{
if(description!=NULL)
{
delete []description;//接口描述
description=NULL;
}
if(function_name!=NULL)
{
delete []function_name;//接口名稱
function_name=NULL;
}
int i=0;
}
xxx=TRUE;
}
_declspec(dllexport) void operator <<(CArchive& ar,tagconector& it)
{
ar<<it.type_in;
ar<<it.in_param_cnt;
ar<<it.out_param_cnt;
ar<<it.description_length;
for(int i=0;i<it.description_length;i++)
ar<<it.description[i];
ar<<it.function_length;
for(i=0;i<it.function_length;i++)
ar<<it.function_name[i];
i=10;
}
_declspec(dllexport) void operator >>(CArchive& ar,tagconector& it)
{int bag;
ar>>bag;
it.type_in=(mytype)bag;
ar>>it.in_param_cnt;
ar>>it.out_param_cnt;
ar>>it.description_length;
it.description=new char[it.description_length];
for(int i=0;i<it.description_length;i++)
ar>>it.description[i];
ar>>it.function_length;
it.function_name=new char[it.function_length];
for(i=0;i<it.function_length;i++)
ar>>it.function_name[i];
it.xxx=FALSE;
}
command::command(mydata *p,int n)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// run_info=new char[1000];
run_info=NULL;
icount_in=n;
data_in=p;
clsid=EMPTY_IID;
iid=EMPTY_IID;
libid=EMPTY_IID;
run_info=NULL;
conector_cnt=0;
cmd_name=NULL;//模塊名稱
cmd_info=NULL;//模塊詳細信息
cmd_where=NULL;//模塊磁盤路徑及相關信息
for(int i=0;i<MAX_CONECTOR_COUNT;i++)
{conector[i].function_name=NULL;//接口名稱
conector[i].description=NULL;
}
}
void command::attach(int id,char* name,int name_length,char* info,int info_length,char* where,int size)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
int i;
cmd_id=id;
cmd_name=new char[name_length];
cmd_where=new char[size];
cmd_info=new char[info_length];
for(i=0;i<name_length;i++)
cmd_name[i]=name[i];
for(i=0;i<size;i++)
cmd_where[i]=where[i];
for(i=0;i<name_length;i++)
cmd_info[i]=info[i];
}
command::command()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// run_info=new char[1000];
run_info=NULL;
// memset(run_info,0,1000);
clsid=EMPTY_IID;
iid=EMPTY_IID;
libid=EMPTY_IID;
conector_cnt=0;
cmd_name=NULL;//模塊名稱
cmd_info=NULL;//模塊詳細信息
cmd_where=NULL;//模塊磁盤路徑及相關信息
hdll=NULL;
data_in=NULL;
}
command::~command()
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
//delete []run_info;
//run_info=NULL;
if(cmd_name!=NULL)
{
delete []cmd_name;
cmd_name=NULL;
}
if(cmd_info!=NULL)
{
delete []cmd_info;
cmd_info=NULL;
}
if(cmd_where!=NULL)
{
delete []cmd_where;
cmd_where=NULL;
}
if(hdll!=NULL)
{
::FreeLibrary(hdll);
hdll=NULL;
}
for(unsigned int i=0;i<conector_cnt;i++)
{conector[i].~tagconector();
}
if(data_in!=NULL)
delete data_in;
}
LRESULT command::go(mydata* data_in,int* pcid,int cnt)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// memset(run_info,0,1000);
int result=0;
if(cmd_name!=NULL)
{if(cmd_type==com_std) //遵循定義的標準接口
{
CString info(cmd_name,name_length);
myinterface* face;
if(FAILED(CoInitialize(NULL)))
AfxMessageBox("組件庫初試化錯誤");
HRESULT hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC,iid,(void**)&face);
if(FAILED(hr))
AfxMessageBox(info+"模塊沒有找到");
}
else if(cmd_type==com_disp) //格式自由的派發接口
{ _MCLCONVERSION_FLAGS flags;
IMWFlags* pFlags = NULL;
disp_conector it;
disp_conector* pit=⁢
DISPID dispid;
IDispatch* dp;
CString info(cmd_name,name_length);
if(FAILED(CoInitialize(NULL)))
{AfxMessageBox("組件庫初試化錯誤");
return -1;
}
if (FAILED(CoCreateInstance(CLSID_MWFlags, NULL, CLSCTX_INPROC_SERVER,
IID_IMWFlags, (void**)&pFlags)))
{AfxMessageBox("矩陣轉換模塊沒有找到,請檢查Matlab數學庫是否正確安裝");
return -1;
};
if (FAILED(GetConversionFlags(pFlags, &flags)))
{
AfxMessageBox("Error getting data conversion flags");
return -1;
}
pFlags->Release();
HRESULT hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC,iid,(void**)&dp);
if(FAILED(hr))
{
return -1;
} //必要的準備
int j,k=0;
for(j=0;j<cnt;j++)
{for(unsigned int i=0;i<this->conector_cnt;i++)
{
if(*(pcid+j)==i)//目標借口函數=?當前借口
{
CString info(conector[i].description,conector[i].description_length);
LPOLESTR lcmd_name=new unsigned short[conector[i].description_length];
char *ssss=(char*)lcmd_name;
for( k=0;k<conector[i].description_length;k++)
lcmd_name[k]=conector[i].description[k];
hr=dp->GetIDsOfNames(IID_NULL,&lcmd_name,1,LOCALE_SYSTEM_DEFAULT,&dispid);
DWORD* dwp=(DWORD*)dp;
DWORD* vtable=(DWORD*)(*dwp);
DWORD* dw=(DWORD*)&(pit->p1i0o);
*dw=*(vtable+DISP_BASE+dispid);
static VARIANT in_bag[MAX_IN_PARAM] ;
static VARIANT out_bag[MAX_OUT_PARAM];
if(!conector[i].in_param_cnt==data_in->the_length)
{//AfxMessageBox(info+"參數數量錯誤");
return -1;
}
//InitConversionFlags(&flags);
for(k=0;k<conector[i].in_param_cnt;k++)
mxArray2Variant(data_in->pdata.mw[k].GetData(),in_bag+k,&flags);
int the_func_type=5*(conector[i].in_param_cnt)+conector[i].out_param_cnt;
int hr=invoke(dp,pit,the_func_type,out_bag,in_bag);
// float*a =out_bag->parray;
mxArray *tempbag[MAX_OUT_PARAM];
for(k=0;k<MAX_OUT_PARAM;k++)
tempbag[k]=NULL;
mwArray mwbag[MAX_OUT_PARAM];
for(k=0;k<conector[i].out_param_cnt;k++)
{
Variant2mxArray(out_bag+k,tempbag+k,&flags);
mwbag[k]=mwArray(tempbag[k]);//mx結構賦予mw類以后由mw析構,切記!!!
}
// double r[10],im[10];
// mwbag[0].ExtractData(r,im);
tinfo.Empty();
tinfo=CString("流水線數據");
tinfo+='\n';
tinfo+="第 ";
tinfo+=level+'0';
tinfo+=" 級: ";
for(unsigned int ti=0;ti<name_length;ti++)
tinfo+=cmd_name[ti];
tinfo+='\n';
unsigned int lth=tinfo.GetLength();
for(ti=0;ti<conector[i].function_length;ti++)
tinfo+=conector[i].function_name[ti];
run_info=tinfo.GetBuffer(4);
int z=0;
// run_info[lth+name_length+1]='\0';
(data_in+1)->mset_data(run_info,tinfo.GetLength()+4,type_mw,NULL,NULL,conector[i].out_param_cnt,mwbag);
// for(k=0;k<conector[i].out_param_cnt;k++)
// mxDestroyArray(tempbag[k]);
// delete[] tempbag;
// delete[] out_bag;
// delete[] in_bag;
}
}
}
}
else if(cmd_type==function)//普通DLL函數接口
{
if(level>=special)
hdll=::LoadLibrary(cmd_where);
for(unsigned int j=0;j<cnt;j++)
{
for(unsigned int i=0;i<this->conector_cnt;i++)
{
if(*(pcid+j)==i)
{(data_in+1)->outer=TRUE;
if((conector+i)->type_in==type_dou)
{ unsigned int cnt;
double bag;
(conector+i)->pfunc.doufunc=(pdaoai)::GetProcAddress(hdll,(conector+i)->description);
if((conector+i)->pfunc.doufunc!=NULL)
{
result=(conector+i)->pfunc.doufunc(&bag,&cnt,data_in->pdata.dou,data_in->the_length);
(data_in+1)->set_data(NULL,NULL,type_dou,cnt,&bag);
}
else
{CString info((conector+i)->function_name,(conector+i)->function_length);
AfxMessageBox(info+"函數沒有找到");
}
}
else if((conector+i)->type_in==type_mw)
{unsigned int cnt;
mwArray bag;
(conector+i)->pfunc.mwfunc=(pdmwomwi)::GetProcAddress(hdll,(conector+i)->description);
if((conector+i)->pfunc.mwfunc!=NULL)
{
result=(conector+i)->pfunc.mwfunc(&bag,&cnt,data_in->pdata.mw,data_in->the_length);
double r[4],i[4];
bag.ExtractData(r,i);
(data_in+1)->mset_data(NULL,NULL,type_mw,NULL,NULL,cnt,&bag);
}
else
{CString info((conector+i)->function_name,(conector+i)->function_length);
AfxMessageBox(info+"函數沒有找到");
}
::FreeLibrary(hdll);
hdll=NULL;
}
// else if((conector+i)->type_in==type_var) //暫時不支持
// (conector+i)->pfunc.varfunc=(pdvovi)::GetProcAddress(hdll,(conector+i)->description);
}
}
}
}
}
else
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -