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

📄 myvc.cpp

📁 170话费查询系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
    	if (strcmp(key, "VOICECHAIN2")==0) {
		p_result = &(pSem[index-1].VoiceChain[1]);
	}
	
	CloseHandle(hMap); 
	ReleaseLock(hlock);
    return p_result; 

}


/****************************************************************************
*
函数: int  CloseCVCA()
说明: 删除通道语音链表区
*
* 目前还不能关闭文件
*
****************************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL CloseCVCA()
{   	
	HANDLE hMap;        //内存文件句柄
	LPVOID p_Map;       //内存文件的指针,可以象数组一样操作
	char   msg[TXT_LEN];


    hMap=::OpenFileMapping(FILE_MAP_WRITE,FALSE,ChannelVoiceChainAreaName);
	if (hMap == NULL) {
		sprintf(msg, "打开通道语音链表区%s出错",ChannelVoiceChainAreaName);
	    ::MessageBox(NULL, msg, "DLL message", MB_OK);	
		return -1;   
	}
 	//获得文件内存地址的指针
	p_Map = MapViewOfFile(hMap,FILE_MAP_WRITE ,0,0,0);
   

	//下面两行代码将把内存文件彻底删除 	
	if (!UnmapViewOfFile(p_Map))
	{ AfxMessageBox("could not unmap view of file"); }

	CloseHandle(hMap); 

	return 0;
}

/****************************************************************************
函数: int  DiskCVCA(char * diskfile, char * s_number)
 说明      :将通道语音链表区写成磁盘文件
 filename : 内存文件名
 diskfile : 信号灯位置(取值 1 .. 30) 
 s_number : 写入个数
****************************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL DiskCVCA(char * diskfile, char * s_number)
{

	HANDLE hMap;        //内存文件句柄
	LPVOID p_Map;       //内存文件的指针,可以象数组一样操作
	OFSTRUCT   ofstruct;
    OFSTRUCT *  pof;
	HANDLE  hdisk;
	DWORD  bytes,p_bytes;
	CVCA * pSem;
    char   msg[TXT_LEN];
	int    number,i,j;

   	HANDLE hlock;				 //共享锁

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

	//写入磁盘的信号灯个数
	number = atoi(s_number);

	if (number<=0) {
	   return 0;
	}
    pof = &(ofstruct);
	//获得通道语音链表区句柄
    hMap=::OpenFileMapping(FILE_MAP_WRITE,FALSE, ChannelVoiceChainAreaName);
	if (hMap == NULL) {
		sprintf(msg, "打开通道语音链表区%s出错",ChannelVoiceChainAreaName);
	    ::MessageBox(NULL, msg, "DLL message", MB_OK);	
		ReleaseLock(hlock);
		return NULL;   
	}    
	//获得文件内存地址的指针
	p_Map = MapViewOfFile(hMap,FILE_MAP_WRITE ,0,0,0);	
	//转换成sempahore指针	
	pSem  = (CVCA *)p_Map;    	

	hdisk = CreateFile(diskfile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	if (hdisk==INVALID_HANDLE_VALUE){
 	    sprintf(msg, "创建磁盘映像文件%s出错",diskfile);
	    ::MessageBox(NULL, msg, "DLL message", MB_OK);	
		CloseHandle(hMap); 
		ReleaseLock(hlock);
        return -1;
	}
    for(i=0; i<number; i++)
	{  
	   sprintf(msg, "\nCVCA[%d].......\n", i);
	   bytes = strlen(msg);
	   if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
	      //::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
	   }

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

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

		sprintf(msg, "通道[%d]的语音链\n",i);
		bytes = strlen(msg);
		if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
				//::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
		}

		strcpy(msg, "\nVoiceChain_1*****************\n");
		bytes = strlen(msg);
		if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
				//::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
		}
	   for (j=0; j<MaxVoiceChainNode; j++)
	   {
		    sprintf(msg, ".[%d]: NodeType=[%s]  IndexName =[%s]\n", j,pSem[i].VoiceChain[0][j].NodeType,pSem[i].VoiceChain[0][j].Content);
			bytes = strlen(msg);
			if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
				//::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
			}
	   }

		strcpy(msg, "\nVoiceChain_2*****************\n");
		bytes = strlen(msg);
		if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
				//::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
		}
	   for (j=0; j<MaxVoiceChainNode; j++)
	   {
		    sprintf(msg, ".[%d]: NodeType=[%s]  IndexName =[%s]\n", j,pSem[i].VoiceChain[1][j].NodeType,pSem[i].VoiceChain[1][j].Content);
			bytes = strlen(msg);
			if(WriteFile(hdisk, msg, bytes, &p_bytes,NULL)==0) {
				//::MessageBox(NULL, "写磁盘映像文件出错", "DLL message", MB_OK);	
			}
	   }

	   
	}
	CloseHandle(hdisk);
	CloseHandle(hMap); 
	ReleaseLock(hlock);
	return 0;
   
}




/**********************************************************************************************
*
*
*                                   全局通讯区操作函数
*
*
**********************************************************************************************/
/***************************************************************
*
*    函数 int CreateGCA()
*    说明:在内存中创建全局通讯区
* 
***************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL  CreateGCA(void)
{		
    HANDLE hMap;                   //内存文件句柄
    
	hMap = CreateFileMapping((HANDLE)-1,NULL,PAGE_READWRITE,0, sizeof(GCA),GlobalCommuAreaName);
    if (hMap != NULL)  { //文件创建成功
		if(GetLastError() == ERROR_ALREADY_EXISTS) {
           //::MessageBox(NULL, "全局通讯区(GCA)已经存在!", "DLL message", MB_OK);	
		}
		else{
		   //::MessageBox(NULL, "全局通讯区(GCA)已成功创建!", "DLL message", MB_OK);	
		}           
		//共享资源已经创建,然后创建资源共享琐
		CreateShareLock(MUTEX_GCA);

        return 1;
	} 
	else
	{		

	    ::MessageBox(NULL, "创建/打开全局通讯区(GCA)出错!", "DLL message", MB_OK);	
		return 0;   
	}
}
/***********************************************************************************************
	函数: int SetGCA(char * key, char * value)
	说明: 给GCA赋值
	key      : 项目, 不包括 RefuseCall
	value    : 值
************************************************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL SetGCA(char * key, char * value)
{   	
	GCA * pGCA;
	char l_key[50];
    HANDLE hMap;                 
    LPVOID p_Map;                
	HANDLE hlock;				 //共享锁

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

    
	strcpy(l_key, key);
	upstring(l_key, l_key);

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

	if (strcmp(l_key, "CHANNELNUMBER")==0) {        //	ChannelNumber
        strcpy(pGCA->ChannelNumber,value);
	}
	if (strcmp(l_key, "SEMAPHORENAME")==0) {        //	SemaphoreName
        strcpy(pGCA->SemaphoreName,value);
	}
    if (strcmp(l_key, "SQLCOMMANDNAME")==0) { 	    //	SQLCommandName
	    strcpy(pGCA->SQLCommandName,value);
	}
	if (strcmp(l_key, "SQLRESULTNAME")==0) {        //	SQLResultName
        strcpy(pGCA->SQLResultName,value);
	}
    if (strcmp(l_key, "SQLRESULTSAVED")==0) { 	    //	SQLResultSaved
	    strcpy(pGCA->SQLResultSaved,value);
	}	
	if (strcmp(l_key, "CONTROLAPPNAME")==0) {       //	ControlAppName
        strcpy(pGCA->ControlAppName,value);
	}
	if (strcmp(l_key, "DBSERVERAPPNAME")==0) {      //	DBServerAppName
        strcpy(pGCA->DBServerAppName,value);
	}
    if (strcmp(l_key, "DBCLIENTAPPNAME")==0) {  	//	DBClientAppName
	    strcpy(pGCA->DBClientAppName,value);
	}
    if (strcmp(l_key, "CUIJIAOAPPNAME")==0) {  	    //	DBClientAppName
	    strcpy(pGCA->DBClientAppName,value);
	}
	if (strcmp(l_key, "STARTQUERYMONTH")==0) {      //	StartQueryMonth
        strcpy(pGCA->StartQueryMonth,value);
	}
    if (strcmp(l_key, "ENDQUERYMONTH")==0) { 	    //	EndQueryMonth
	    strcpy(pGCA->EndQueryMonth,value);
	}
    if (strcmp(l_key, "CURQFTABLE")==0) { 	    //	CurQfTable
	    strcpy(pGCA->CurQfTable,value);
	}
	if (strcmp(l_key, "LOG_UTPT")==0) {           //	Log_Utpt
        strcpy(pGCA->Log_Utpt,value);
	}
	if (strcmp(l_key, "INITSTATUS")==0) {          //	InitStatus
        strcpy(pGCA->InitStatus,value);
	}
    if (strcmp(l_key, "INITHIDE")==0) { 	       //	InitHide
	    strcpy(pGCA->InitHide,value);
	}
    if (strcmp(l_key, "VFIT_LEN")==0) { 	       //	VFIT_LEN
	    strcpy(pGCA->VFIT_LEN,value);
	}
    if (strcmp(l_key, "VOX_PATH")==0) {		 	       //	vox
	    strcpy(pGCA->vox_path,value);
	}
    if (strcmp(l_key, "TXT")==0) {		 	       //	txt
	    strcpy(pGCA->txt,value);
	}


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

/***********************************************************************************************
	函数: int SetGCARefuseCall(char * index, char * teleno)
	说明: 给GCA赋值
	index      : RefuseCall表的位置
	teleno     : 拒绝服务的号码
	说明:随后一个RefuseCall将自动设置为"EOT"
************************************************************************************************/
extern "C" _declspec ( dllexport ) int PASCAL SetGCARefuseCall(char * index ,char * teleno)
{   	
	GCA * pGCA;
	int l_index;
    HANDLE hMap;                 
    LPVOID p_Map;                
	HANDLE hlock;				 //共享锁

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

    
	l_index = atoi(index)-1;
	if (l_index >MaxRefuseCall-1) {
	   WinPrintf("SetGCARefuseCall()错误:index(%d) > MaxRefuseCall(%d)",l_index,MaxRefuseCall);
	   ReleaseLock(hlock);
	   return 0;
	}

    //打开GCA文件
    hMap=::OpenFileMapping(FILE_MAP_WRITE,FALSE, GlobalCommuAreaName);	
	if (hMap == NULL) {
	    ::MessageBox(NULL, "打开全局共享区(GCA)出错!", "DLL message", MB_OK);	
		ReleaseLock(hlock);
		return 0;   
	}
    	
	//获得GCA内存地址的指针
	p_Map = MapViewOfFile(hMap,FILE_MAP_WRITE ,0,0,0);
	if (p_Map == NULL) {
       ::MessageBox(NULL, "SetGCAREFUSECALL():p_Map is NULL!","DLL message", MB_OK);	
	}
	pGCA  = (GCA *)p_Map;
	if (pGCA == NULL) {
		::MessageBox(NULL, "SetGCAREFUSECALL():p_Sem is NULL!", "DLL message",MB_OK);	
	}
	
	strcpy(pGCA->RefuseCall[l_index],teleno);
	strcpy(pGCA->RefuseCall[l_index+1],"EOT");  //下一个置为结束 End of Table

	CloseHandle(hMap); 
	ReleaseLock(hlock);
    return 1;
}


/***********************************************************************************************
	函数: LPVOID ReadGCA(char * key, char * value)
	说明: 读取GCA的值
	key      : 项目, 不包括 RefuseCall
	value    : 值
************************************************************************************************/
extern "C" _declspec ( dllexport ) LPVOID PASCAL ReadGCA(char * key)
{   	
	GCA * pGCA;
    char msg[TXT_LEN];
	char l_key[50];
    HANDLE hMap;                 
    LPVOID p_Map, p_result;          
	HANDLE hlock;				 //共享锁

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

	strcpy(l_key, key);
	upstring(l_key, l_key);

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

	if (strcmp(l_key, "CHANNELNUMBER")==0) {        //	ChannelNumber
		p_result = &(pGCA->ChannelNumber);
	}
	if (strcmp(l_key, "SEMAPHORENAME")==0) {        //	SemaphoreName
		p_result = &(pGCA->SemaphoreName);
	}
    if (strcmp(l_key, "SQLCOMMANDNAME")==0) { 	    //	SQLCommandName
		p_result = &(pGCA->SQLCommandName);

⌨️ 快捷键说明

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