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