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

📄 diaobiao97.cpp

📁 一个电度表的通信规约,组态王调用此程序,具体方法代码中有注释.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// testdll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "DiaoBiao97.h"
#include <stdio.h>
#include <math.h>
static DWORD dwTlsIndex; 
static DWORD dwTlsIndexComm; 

#define BOXMAXCOUNT 80  //通道中最大装置个数

BOOL APIENTRY DllMain( HANDLE hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved
					  )
{
    LPVOID lpvData; 
    BOOL fIgnore; 
	
    switch (ul_reason_for_call) { 
	case DLL_PROCESS_ATTACH: 
		
		if ((dwTlsIndex = TlsAlloc()) == 0xFFFFFFFF) 
			return FALSE; 
		if ((dwTlsIndexComm = TlsAlloc()) == 0xFFFFFFFF) 
			return FALSE; 
		
	case DLL_THREAD_ATTACH: 
		
		lpvData = (LPVOID) LocalAlloc(LPTR, sizeof(CallbackStruct)); 
		if (lpvData != NULL) 
			fIgnore = TlsSetValue(dwTlsIndex, lpvData); 
		
		lpvData = (LPVOID) LocalAlloc(LPTR, sizeof(BoxPrivateData)*BOXMAXCOUNT); 
		if (lpvData != NULL) 
			fIgnore = TlsSetValue(dwTlsIndexComm, lpvData); 
		
		break; 
		
	case DLL_THREAD_DETACH: 
		
		lpvData = TlsGetValue(dwTlsIndex); 
		
		if (lpvData != NULL) 
			LocalFree((HLOCAL) lpvData); 
		
		lpvData = TlsGetValue(dwTlsIndexComm); 
		
		if (lpvData != NULL) 
			LocalFree((HLOCAL) lpvData); 
		
		break; 
		
	case DLL_PROCESS_DETACH: 
		
		lpvData = TlsGetValue(dwTlsIndex); 
		if (lpvData != NULL) 
			LocalFree((HLOCAL) lpvData); 
		TlsFree(dwTlsIndex); 
		
		lpvData = TlsGetValue(dwTlsIndexComm); 
		if (lpvData != NULL) 
			LocalFree((HLOCAL) lpvData); 
		TlsFree(dwTlsIndexComm); 
		
		break; 
		
	default: 
		break; 
		
	} 
	
    return TRUE; 
}

int  CallbackSendData(long addr,char * buff,int count);
int  CallbackReceiveData(long addr,char * buff,int count);
int  CallbackIsExit(void);
void CallbackOnEventMessage(char * buff,DWORD msgType);
void CallbackClearBuff(BYTE ClearFlag);

int CallbackSendData(long addr,char * buff,int count)
{
	CallbackStruct * pCallback;
	lpSendData fnSendData;
	pCallback=(CallbackStruct *)TlsGetValue(dwTlsIndex);
	void * pThis;
	pThis=pCallback->pThis;
	fnSendData=pCallback->fnSendData;
	int retvalue;
	_asm{
		push count
			push buff
			push addr
			mov ecx,pThis
			call  fnSendData
			mov retvalue,eax
	};
	return retvalue;
}

int CallbackReceiveData(long addr,char * buff,int count)
{
	CallbackStruct * pCallback;
	lpReceiveData fnReceiveData;
	pCallback=(CallbackStruct *)TlsGetValue(dwTlsIndex);
	void * pThis;
	pThis=pCallback->pThis;
	fnReceiveData=pCallback->fnReceiveData;
	int retvalue;
	_asm{
		push count
			push buff
			push addr
			mov ecx,pThis
			call  fnReceiveData
			mov retvalue,eax
	};
	return retvalue;
}

int CallbackIsExit(void)
{
    int retvalue;
	CallbackStruct * pCallback;
	lpIsExit fnIsExit;
	pCallback=(CallbackStruct *)TlsGetValue(dwTlsIndex);
	void * pThis;
	pThis=pCallback->pThis;
	fnIsExit=pCallback->fnIsExit;
	_asm{
		mov ecx,pThis
			call fnIsExit;
		mov retvalue,eax
	};
	return retvalue;
}

void CallbackOnEventMessage(char * buff,DWORD msgType)
{
	CallbackStruct * pCallback;
	lpOnEventMessage fnOnEventMessage;
	pCallback=(CallbackStruct *)TlsGetValue(dwTlsIndex);
	void * pThis;
	pThis=pCallback->pThis;
	fnOnEventMessage=pCallback->fnOnEventMessage;
	_asm{
		push msgType
			push buff
			mov ecx,pThis
			call fnOnEventMessage
	};
	
}

void CallbackClearBuff(BYTE ClearFlag)
{
	CallbackStruct * pCallback;
	lpClearBuff fnClearBuff;
	pCallback=(CallbackStruct *)TlsGetValue(dwTlsIndex);
	void * pThis;
	pThis=pCallback->pThis;
	fnClearBuff=pCallback->fnClearBuff;
	_asm{
		push ClearFlag
			mov ecx,pThis
			call fnClearBuff;
	};
	
}

void SetBoxPraData(long Addr,BYTE index,BYTE value)
{
    BoxPrivateData * pCommErrorState;
	pCommErrorState=(BoxPrivateData *)TlsGetValue(dwTlsIndexComm);
	for(int i=0;i<BOXMAXCOUNT;i++)
	{
		if(pCommErrorState[i].Addr==-1)
			pCommErrorState[i].Addr=Addr;
		
		if(pCommErrorState[i].Addr==Addr)
		{
			if(index<BOX_DATA_LEN)
			{
				pCommErrorState[i].Reserve[index]=value;
			}
			return ;
		}
	}
}

BYTE GetBoxPraData(long Addr,BYTE index)
{
	
	BoxPrivateData * pCommErrorState;
	pCommErrorState=(BoxPrivateData *)TlsGetValue(dwTlsIndexComm);
	for(int i=0;i<BOXMAXCOUNT;i++)
	{
		if(pCommErrorState[i].Addr==-1)
			pCommErrorState[i].Addr=Addr;
		
		if(pCommErrorState[i].Addr==Addr)
		{
            if(index<BOX_DATA_LEN)
			{
				return pCommErrorState[i].Reserve[index];
			}
		}
	}
	
	return 0;
}

long AddErrorCount(long Addr,int count)
{
	BoxPrivateData * pCommErrorState;
	pCommErrorState=(BoxPrivateData *)TlsGetValue(dwTlsIndexComm);
	for(int i=0;i<BOXMAXCOUNT;i++)
	{
		if(pCommErrorState[i].Addr==-1)
			pCommErrorState[i].Addr=Addr;
		
		if(pCommErrorState[i].Addr==Addr)
		{
			pCommErrorState[i].CommErrorCount+=count;
			return pCommErrorState[i].CommErrorCount;
		}
	}
	return -1;
}

long GetErrorCount(long Addr)
{
	BoxPrivateData * pCommErrorState;
	pCommErrorState=(BoxPrivateData *)TlsGetValue(dwTlsIndexComm);
	for(int i=0;i<BOXMAXCOUNT;i++)
	{
		if(pCommErrorState[i].Addr==-1)
			pCommErrorState[i].Addr=Addr;
		
		if(pCommErrorState[i].Addr==Addr)
			return pCommErrorState[i].CommErrorCount;
	}
	return -1;
}

long ClearErrorCount(long Addr)
{
	BoxPrivateData * pCommErrorState;
	pCommErrorState=(BoxPrivateData *)TlsGetValue(dwTlsIndexComm);
	for(int i=0;i<BOXMAXCOUNT;i++)
	{
		if(pCommErrorState[i].Addr==-1)
			pCommErrorState[i].Addr=Addr;
		
		if(pCommErrorState[i].Addr==Addr)
		{
			pCommErrorState[i].CommErrorCount=0;
			return 0;
		}
	}
	return -1;
}

void InitErrorCount()
{
	BoxPrivateData * pCommErrorState;
	pCommErrorState=(BoxPrivateData *)TlsGetValue(dwTlsIndexComm);
	for(int i=0;i<BOXMAXCOUNT;i++)
	{
		pCommErrorState[i].Addr=-1;
		pCommErrorState[i].CommErrorCount=0;
		::memset(pCommErrorState[i].Reserve,0,BOX_DATA_LEN);
	}
	
}
//////////////////////////////////////////////////////////////////////////////////#
////////////////////***************************************///////////////////////#
////////////////////*以此为界,不要随便更改以上程序!!!!!*///////////////////////#
////////////////////***************************************///////////////////////#
//////////////////////////////////////////////////////////////////////////////////#


//***********************************##动态库源文件使用说明##*****************************
//使用VC++向导新建一个简单的Win32 Dynamic~Link Library项目(在向导的第二步选取第三个选项),
//然后将TemplateDll.cpp和TemplateDll.h,stdafx.h中的
//所有代码全部复制到新建项中的相应文件中,并将TemplateDll.cpp文件中的#include "TemplateDll.h"改为相
//的头文件名即可使用;主程序根据参数库中通道所选择的通信规约名称加上版本号合成动态库名称,并
//在通信线程启动时动态加载动态库;
//如:TemplateDll(V1.0).dll,注意:'V'的大小写,应与参数库的一致;
//*****************************************************************************************



///////////////////////////////******##Connect接口说明##******/////////////////////////////////////////////
//																										 //
//功能:此函数被主程序通信线程启动后首先调用,注册一些回调函数使DLL程序能与主程序通信;					 //
//																										 //
//参数:pThis:回调函数的类指针;type:通信设备类型,可以是串口,基于TCP/UDP的以太网;						 //
//		lpRD:接收数据的回调函数指针;lpSD:发送数据的回调函数指针;lpCB:清除数据的回调函数指针;			 //
//		lpMsg:发送消息的回调函数指针;lpExit:通过此函数指针可查询通讯线程是否已退出;pCommPort:通信设备指针,对于串口是HANDLE类型,对于以太网是socket指针//
//		通过这个指针,DLL程序可以直接控制设备以实现特殊功能;ChannelID:当前通道在参数库中的通讯设备ID,	 //
//		可根据此ID在数据库中查找一些信息;																 //

⌨️ 快捷键说明

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