📄 myvc.cpp
字号:
}
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 + -