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

📄 command.cpp

📁 故障诊断工作涉及的领域相当广泛
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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=&it;
		 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 + -