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

📄 myvc.cpp

📁 170话费查询系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			if (p_Map == NULL) {
				::MessageBox(NULL, "初始化QSSA失败:p_Map is NULL!","DLL message", MB_OK);
				return 1;
			}
			pQSSA  = (QSSA *)p_Map;		
			if (pQSSA == NULL) {
				::MessageBox(NULL, "初始化QSSA失败::pQSSA is NULL!", "DLL message",MB_OK);
				return 1;
			}
            for (i=0; i<MaxQueryDemand; i++)
			{
                strcpy(pQSSA[i].Active,"N");				
				strcpy(pQSSA[i].QuerySyntaxName,"");
				//if (i==0) strcpy(pQSSA[i].QuerySyntaxName,Query_CTXD);  //define in myvc.h
				//if (i==1) strcpy(pQSSA[i].QuerySyntaxName,Query_BDWXD);
				//if (i==2) strcpy(pQSSA[i].QuerySyntaxName,Query_168XD);
                //if (i==3) strcpy(pQSSA[i].QuerySyntaxName,Query_DJDY);
                //if (i==4) strcpy(pQSSA[i].QuerySyntaxName,Query_TSHOU);
                //if (i==5) strcpy(pQSSA[i].QuerySyntaxName,Query_QF);
                strcpy(pQSSA[i].BaseSQLSyntax,"");
				strcpy(pQSSA[i].DestTable,"");
				strcpy(pQSSA[i].VoiceExpTable,"");
			}
		   // 初始化完毕.
		}     
		//共享资源创建,然后创建资源共享琐
		CreateShareLock(MUTEX_QSSA);
        return 1;
	} 
	else
	{		
	    ::MessageBox(NULL, "创建/打开查询语法结构区(QSSA)出错!", "DLL message", MB_OK);	
		return 0;   
	}
}
/***********************************************************************************************
	函数: int SetQSSA(char * key, char * value)
	说明: 给QSSA赋值
	key      : 项目,
	value    : 值
************************************************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL SetQSSA(char * qname, char * key, char * value)
{   	
	QSSA * pQSSA;
	char l_key[50];
    HANDLE hMap;                 
    LPVOID p_Map; 
	int    i,index;
	char   queryname[60], ExistName[60];
    bool   name_match=false;
   	HANDLE hlock;				 //共享锁

	//等待共享文件被释放,然后抢占并琐定
	hlock = WaitLock(MUTEX_QSSA);

	lstrcpy(queryname, qname);      //语法名
    upstring(queryname, queryname);
	lstrcpy(l_key, key);
	upstring(l_key, l_key);

    //打开QSSA文件
    hMap=::OpenFileMapping(FILE_MAP_WRITE,FALSE, QuerySyntaxStructAreaName);	
	if (hMap == NULL) {
	    ::MessageBox(NULL, "打开全局共享区(QSSA)出错!", "DLL message", MB_OK);	
		ReleaseLock(hlock);
		return 0;   
	}
    	
	//获得QSSA内存地址的指针
	p_Map = MapViewOfFile(hMap,FILE_MAP_WRITE ,0,0,0);
	if (p_Map == NULL) {
       ::MessageBox(NULL, "SetQSSA():p_Map is NULL!","DLL message", MB_OK);	
	   ReleaseLock(hlock);
	   return 0;
	}
	pQSSA  = (QSSA *)p_Map;		
	if (pQSSA == NULL) {
		::MessageBox(NULL, "SetQSSA():pQSSA is NULL!", "DLL message",MB_OK);	
		ReleaseLock(hlock);
		return 0;
	}

/*        
        bool     Active;                  //本结构块是否启用。
        char     QuerySyntaxName[20];     //查询语法名,与表T_SYS_SQLEXP.QuerySyntaxName对应。
        char     BaseSQLSyntax[1024];     //基本查询语句,与通讯结构SQLCMD.SQLCommand对应。
        char     DestTable[512];          //目标数据表
        char     VoiceExpTable[2048];     //和查询字段对应的语音解析表
*/

	//寻找特定语法名
    for (i=0; i<MaxQueryDemand; i++)
	{
	   strcpy(ExistName, pQSSA[i].QuerySyntaxName);
	   upstring(ExistName, ExistName);
	   if (strcmp(queryname, ExistName)==0){
	      name_match = true;
		  index      = i;
	   }
	}

	if  (name_match ==true) {
	    
		if (strcmp(l_key, "ACTIVE")==0) {        //	Active
		    strcpy(pQSSA[index].Active,value);
		}
		if (strcmp(l_key, "QUERYSYNTAXNAME")==0) {        //	QuerySyntaxName
		    strcpy(pQSSA[index].QuerySyntaxName,value);
		}
    	if (strcmp(l_key, "BASESQLSYNTAX")==0) { 	    //	BaseSQLSyntax
			strcpy(pQSSA[index].BaseSQLSyntax,value);
		}
		if (strcmp(l_key, "DESTTABLE")==0) {        //	DestTable
			strcpy(pQSSA[index].DestTable,value);
		}
    	if (strcmp(l_key, "VOICEEXPTABLE")==0) { 	    //	VoiceExpTable
			strcpy(pQSSA[index].VoiceExpTable,value);
		}	
		CloseHandle(hMap); 
		if (!UnmapViewOfFile(p_Map))
		{ AfxMessageBox("could not unmap view of file"); }
		ReleaseLock(hlock);
		return 1;
	}
	else
	{
		CloseHandle(hMap); 
		if (!UnmapViewOfFile(p_Map))
		{ AfxMessageBox("could not unmap view of file"); }
		ReleaseLock(hlock);
		return 0;
	
	}
}

/***********************************************************************************************
	函数: int InitQSSA(char * s_index, char * key, char * value)
	说明: QSSA初始化
	s_index  : QSSA数组的位置
	key      : 项目, 不包括 RefuseCall
	value    : 值
************************************************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL InitQSSA(char * s_index, char * key, char * value)
{   	
	QSSA * pQSSA;
	char l_key[50];
    HANDLE hMap;                 
    LPVOID p_Map; 
	int    index;
   	HANDLE hlock;				 //共享锁

	//等待共享文件被释放,然后抢占并琐定
	hlock = WaitLock(MUTEX_QSSA);

    
	index = atoi(s_index)-1;

	if (index > MaxQueryDemand) {  //超出范围
	   return 0;
	   ReleaseLock(hlock);
	}
	
	strcpy(l_key, key);
	upstring(l_key, l_key);

    //打开QSSA文件
    hMap=::OpenFileMapping(FILE_MAP_WRITE,FALSE, QuerySyntaxStructAreaName);	
	if (hMap == NULL) {
	    ::MessageBox(NULL, "打开全局共享区(QSSA)出错!", "DLL message", MB_OK);	
		ReleaseLock(hlock);
		return 0;   
	}
    	
	//获得QSSA内存地址的指针
	p_Map = MapViewOfFile(hMap,FILE_MAP_WRITE ,0,0,0);
	if (p_Map == NULL) {
       ::MessageBox(NULL, "SetQSSA():p_Map is NULL!","DLL message", MB_OK);	
	   ReleaseLock(hlock);
	   return 0;
	}
	pQSSA  = (QSSA *)p_Map;		
	if (pQSSA == NULL) {
		::MessageBox(NULL, "SetQSSA():pQSSA is NULL!", "DLL message",MB_OK);	
		ReleaseLock(hlock);
		return 0;
	}

/*        
        bool     Active;                  //本结构块是否启用。
        char     QuerySyntaxName[20];     //查询语法名,与表T_SYS_SQLEXP.QuerySyntaxName对应。
        char     BaseSQLSyntax[1024];     //基本查询语句,与通讯结构SQLCMD.SQLCommand对应。
        char     DestTable[512];          //目标数据表
        char     VoiceExpTable[2048];     //和查询字段对应的语音解析表
*/
	    
		if (strcmp(l_key, "ACTIVE")==0) {        //	Active
		    strcpy(pQSSA[index].Active,value);
		}
		if (strcmp(l_key, "QUERYSYNTAXNAME")==0) {        //	QuerySyntaxName
		    strcpy(pQSSA[index].QuerySyntaxName,value);
		}
    	if (strcmp(l_key, "BASESQLSYNTAX")==0) { 	    //	BaseSQLSyntax
			strcpy(pQSSA[index].BaseSQLSyntax,value);
		}
		if (strcmp(l_key, "DESTTABLE")==0) {        //	DestTable
			strcpy(pQSSA[index].DestTable,value);
		}
    	if (strcmp(l_key, "VOICEEXPTABLE")==0) { 	    //	VoiceExpTable
			strcpy(pQSSA[index].VoiceExpTable,value);
		}	
		CloseHandle(hMap); 
		if (!UnmapViewOfFile(p_Map))
		{ AfxMessageBox("could not unmap view of file"); }
		ReleaseLock(hlock);
		return 1;

}



/***********************************************************************************************
	函数: LPVOID ReadQSSA(char * key, char * value)
	说明: 读取QSSA的值
	
	value    : 值
************************************************************************************************/
extern "C" _declspec ( dllexport ) LPVOID PASCAL ReadQSSA(char *qname, char * key)
{   	
	QSSA * pQSSA;
    char msg[TXT_LEN];
	char l_key[50];
    HANDLE hMap;                 
    LPVOID p_Map, p_result;          
	char   queryname[60], ExistName[60];
    bool   name_match=false;
    int    i, index;
   	HANDLE hlock;				 //共享锁

	//等待共享文件被释放,然后抢占并琐定
	hlock = WaitLock(MUTEX_QSSA);

    

	lstrcpy(queryname, qname);      //语法名
    upstring(queryname, queryname);

	lstrcpy(l_key, key);
	upstring(l_key, l_key);

    //打开QSSA文件
    hMap=::OpenFileMapping(FILE_MAP_WRITE,FALSE,QuerySyntaxStructAreaName);	
	if (hMap == NULL) {
	    ::MessageBox(NULL, "打开全局共享区(QSSA)出错!", "DLL message", MB_OK);	
		ReleaseLock(hlock);
		return NULL;   
	}
    	
	//获得QSSA内存地址的指针
	p_Map = MapViewOfFile(hMap,FILE_MAP_WRITE ,0,0,0);
	if (p_Map == NULL) {
       ::MessageBox(NULL, msg, "ReadQSSA():p_Map is NULL!)", MB_OK);	
	   ReleaseLock(hlock);
	   return NULL;
	}
	pQSSA  = (QSSA *)p_Map;

	if (pQSSA == NULL) {
		ReleaseLock(hlock);
		::MessageBox(NULL, msg, "ReadQSSA():p_Sem is NULL!", MB_OK);
		return NULL;
	}

	//寻找特定语法名
    for (i=0; i<MaxQueryDemand; i++)
	{
	   strcpy(ExistName, pQSSA[i].QuerySyntaxName);
	   upstring(ExistName, ExistName);
	   if (strcmp(queryname, ExistName)==0){
	      name_match = true;
		  index      = i;
		  break;
	   }
	}

	if (name_match==false){
		CloseHandle(hMap); 
	    if (!UnmapViewOfFile(p_Map))
		{ AfxMessageBox("could not unmap view of file"); }
		ReleaseLock(hlock);
		return 0;
	}

	if (strcmp(l_key, "ACTIVE")==0) {        //	Active
        	p_result = &(pQSSA[index].Active);
	}
	if (strcmp(l_key, "QUERYSYNTAXNAME")==0) {        //	QuerySyntaxName
        	p_result = &(pQSSA[index].QuerySyntaxName);
	}
    	if (strcmp(l_key, "BASESQLSYNTAX")==0) { 	    //	BaseSQLSyntax
        	p_result = &(pQSSA[index].BaseSQLSyntax);	    
	}
	if (strcmp(l_key, "DESTTABLE")==0) {        //	DestTable
        	p_result = &(pQSSA[index].DestTable);
	}
    	if (strcmp(l_key, "VOICEEXPTABLE")==0) { 	    //	VoiceExpTable
        	p_result = &(pQSSA[index].VoiceExpTable);
	}	

	CloseHandle(hMap); 
//    if (!UnmapViewOfFile(p_Map))
//	{ AfxMessageBox("could not unmap view of file"); }
	ReleaseLock(hlock);
    return p_result;
}

/*****************************************************************************************
 函数	: int  DiskQSSA(char * diskfile)
 说明	:将QSSA写入磁盘文件
		diskfile : 磁盘文件名
****************************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL DiskQSSA(char * diskfile)
{

	HANDLE		hMap;        
	LPVOID		p_Map;       
	OFSTRUCT	ofstruct;
        OFSTRUCT *  pof;
	HANDLE		hdisk;
	DWORD		bytes,p_bytes;
	QSSA		 *  pQSSA;
	char		msg[2048];
	int         i;

   	HANDLE hlock;				 //共享锁

	//等待共享文件被释放,然后抢占并琐定
	hlock = WaitLock(MUTEX_QSSA);


    pof = &(ofstruct);
	hMap=::OpenFileMapping(FILE_MAP_WRITE,FALSE, QuerySyntaxStructAreaName);
	if (hMap == NULL) {
	    ::MessageBox(NULL, "DiskQSSA():打开全局共享区(QSSA)出错!", "DLL message", MB_OK);	
		ReleaseLock(hlock);
		return NULL;   
	}    
	p_Map = MapViewOfFile(hMap,FILE_MAP_WRITE ,0,0,0);	
	//转换成sempahore指针	
	pQSSA  = (QSSA *)p_Map;    	

	hdisk = CreateFile(diskfile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	if (hdisk==INVALID_HANDLE_VALUE){
	    ::MessageBox(NULL, "DiskQSSA():创建QSSA磁盘映像文件出错!", "DLL message", MB_OK);	
		CloseHandle(hMap); 
        UnmapViewOfFile(p_Map);
		ReleaseLock(hlock);
        return 0;
	}

	for (i=0; i<MaxQueryDemand; i++)
    {  
	   sprintf(msg, ".Active=[%s]\n", pQSSA[i].Active);
	   bytes = strlen(msg);
	   if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
	      //::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
	   }

	   sprintf(msg, ".QuerySyntaxName=[%s]\n", pQSSA[i].QuerySyntaxName);
	   bytes = strlen(msg);
	   if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
	      //::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
	   }

	   sprintf(msg, ".BaseSQLSyntax=[%s]\n", pQSSA[i].BaseSQLSyntax);
	   bytes = strlen(msg);
	   if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
	      //::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
	   }
	   
	   sprintf(msg, ".DestTable=[%s]\n", pQSSA[i].DestTable);
	   bytes = strlen(msg);
	   if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
	      //::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
	   }

	   sprintf(msg, ".VoiceExpTable=[%s]\n", pQSSA[i].VoiceExpTable);
	   bytes = strlen(msg);
	   if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
	      //::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
	   }
    }

	CloseHandle(hdisk);
	CloseHandle(hMap); 
    UnmapViewOfFile(p_Map);
	ReleaseLock(hlock);
	return 1;
   
}

/**********************************************************************************************
*
*
*                               信号灯文件操作函数
*
*
**********************************************************************************************/
/***************************************************************
*
*    函数 CreateSemaphoneFile(char * s_number)
*    说明:在内存中创建一共享文件filename
* 
**************************************

⌨️ 快捷键说明

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