📄 w32g_ut2.c
字号:
#ifdef W32GUI_DEBUGPrintfDebugWnd("[%s]\n",buffer);#endif if(bRes==TRUE){ break; } Sleep(300); } if(bRes==TRUE){ *size = (int)dwMessageSize; return TRUE; } else return FALSE;}// 柍帇偡傞斉void ReadFromMailslotIgnore(HANDLE hmailslot, int num){ int i; char buffer[10240]; int size; for(i=0;i<num;i++){ if(ReadFromMailslot(hmailslot,buffer,&size)==FALSE) return; } return;}// 儊乕儖僗儘僢僩偵彂偒崬傓HANDLE *OpenMailslot(void){ HANDLE hFile; hFile = CreateFile(TIMIDITY_MAILSLOT,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); if(hFile==INVALID_HANDLE_VALUE) return NULL; else return hFile;}void CloseMailslot(HANDLE hmailslot){ CloseHandle(hmailslot);}int WriteMailslot(HANDLE hmailslot, char *buffer, int size){ DWORD dwWrittenSize; BOOL bRes; bRes = WriteFile(hmailslot,buffer,(DWORD)lstrlen(buffer) + 1,&dwWrittenSize,(LPOVERLAPPED)NULL); if(bRes==FALSE){ return FALSE; } return TRUE;}int isURLFile(char *filename);extern volatile DWORD dwWindowThreadID;volatile argc_argv_t MailslotArgcArgv;volatile int MailslotThreadTeminateFlag = FALSE; void w32gMailslotThread(void){ int i; char buffer[1024]; int size; MailslotArgcArgv.argc = 0; MailslotArgcArgv.argv = NULL; for(i=0;i<10;i++){ hMailslot = CreateMailslot(TIMIDITY_MAILSLOT,0,MAILSLOT_WAIT_FOREVER,(LPSECURITY_ATTRIBUTES)NULL); if (hMailslot != INVALID_HANDLE_VALUE) { break; } hMailslot = NULL; Sleep(300); } if(hMailslot==NULL){ return; } for(;;){ Sleep(1000); if(MailslotThreadTeminateFlag==TRUE){ if(hMailslot!=NULL) CloseHandle(hMailslot); break; } for(;;){ Sleep(200); if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ Sleep(1000); continue; } if(strcasecmp(buffer,MC_HEADER)!=0){ continue; } if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ Sleep(1000); continue; } if(strcasecmp(buffer,MC_TERMINATE)==0){ CloseHandle(hMailslot); w32g_send_rc(RC_STOP, 0); w32g_send_rc(RC_QUIT, 0);// PostThreadMessage(dwWindowThreadID,WM_CLOSE,0,0);// PostThreadMessage(dwWindowThreadID,WM_QUIT,0,0); Sleep(500); return; } if(strcasecmp(buffer,MC_FILES)==0){ char **files; int nfiles; int flag = TRUE; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } nfiles = atoi(buffer); // MailslotArgcArgv丂偑弶婜壔偝傟偰偄側偐偭偨傜張棟搑拞偲偟偰柍帇 if(MailslotArgcArgv.argc!=0 || MailslotArgcArgv.argv!=NULL){ ReadFromMailslotIgnore(hMailslot,nfiles); continue; } files = (char **)malloc(sizeof(char *)*nfiles); if(files==NULL){ ReadFromMailslotIgnore(hMailslot,nfiles); continue; } for(i=0;i<nfiles;i++){ if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ flag = FALSE; break; } files[i] = (char *)malloc(sizeof(char)*(size+1)); if(files[i]==NULL){ int j; ReadFromMailslotIgnore(hMailslot,nfiles-i-1); for(j=0;j<i;j++){ free(files[j]); } flag = FALSE; break; } strncpy(files[i],buffer,size); files[i][size] = 0; } if(flag==FALSE){ free(files); continue; } MailslotArgcArgv.argc = nfiles; MailslotArgcArgv.argv = files; // files 偼暿偺偲偙傠偱夝曻偟偰偔傟傞 w32g_send_rc(RC_EXT_LOAD_FILES_AND_PLAY,(int32)&MailslotArgcArgv);// w32g_send_rc(RC_EXT_LOAD_FILE,(int32)files[0]); continue; } if(strcasecmp(buffer,MC_PLAYLIST_CLEAR)==0){ int param_num; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } param_num = atoi(buffer); w32g_send_rc(RC_EXT_CLEAR_PLAYLIST,0); ReadFromMailslotIgnore(hMailslot,param_num); continue; } if(strcasecmp(buffer,MC_PLAY)==0){ int param_num; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } param_num = atoi(buffer); w32g_send_rc(RC_LOAD_FILE,0); ReadFromMailslotIgnore(hMailslot,param_num); continue; } if(strcasecmp(buffer,MC_PLAY_NEXT)==0){ int param_num; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } param_num = atoi(buffer); w32g_send_rc(RC_NEXT,0); ReadFromMailslotIgnore(hMailslot,param_num); continue; } if(strcasecmp(buffer,MC_PLAY_PREV)==0){ int param_num; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } param_num = atoi(buffer); w32g_send_rc(RC_REALLY_PREVIOUS,0); ReadFromMailslotIgnore(hMailslot,param_num); continue; } if(strcasecmp(buffer,MC_STOP)==0){ int param_num; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } param_num = atoi(buffer); w32g_send_rc(RC_STOP,0); ReadFromMailslotIgnore(hMailslot,param_num); continue; } if(strcasecmp(buffer,MC_PAUSE)==0){ int param_num; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } param_num = atoi(buffer); w32g_send_rc(RC_PAUSE,0); ReadFromMailslotIgnore(hMailslot,param_num); continue; } if(strcasecmp(buffer,MC_SEND_TIMIDITY_INFO)==0){ int param_num; if(ReadFromMailslot(hMailslot,buffer,&size)==FALSE){ continue; } param_num = atoi(buffer); ReadFromMailslotIgnore(hMailslot,param_num); // 壗傕偟側偄 continue; } } }}#define TIMIDTY_MUTEX_NAME "TiMidity_pp_Win32GUI_ver_1_0_0"static HANDLE hMutexTiMidity = NULL;// TiMidity 偑桞堦側傞偙偲傪庡挘偟傑偡// 偦偺徹嫆偺 Mutex 傪 hMutexTiMidity 偵曐帩偟傑偡int UniqTiMidity(void){ hMutexTiMidity = CreateMutex(NULL,TRUE,TIMIDTY_MUTEX_NAME); if(hMutexTiMidity!=NULL && GetLastError()==0){ return TRUE; } if(GetLastError()==ERROR_ALREADY_EXISTS){ ; } if(hMutexTiMidity!=NULL){ CloseHandle(hMutexTiMidity); } hMutexTiMidity = NULL; return FALSE;}// 偡偱偵 TiMidity 偑懚嵼偡傞偐int ExistOldTiMidity(void){ HANDLE hMutex = CreateMutex(NULL,TRUE,TIMIDTY_MUTEX_NAME); if(GetLastError()==ERROR_ALREADY_EXISTS){ if(hMutex!=NULL) CloseHandle(hMutex); return TRUE; } if(hMutex!=NULL) CloseHandle(hMutex); return FALSE;}// 壗夞偐桞堦偺 TiMidity 偵側傠偆偲偟傑偡int TryUniqTiMidity(int num){ int i; for(i=0;i<num;i++){ if(UniqTiMidity()==TRUE){ return TRUE; } Sleep(1000); } return FALSE;}int SendFilesToOldTiMidity(int nfiles, char **files){ int i; HANDLE hmailslot; char buffer[1024]; int size; hmailslot = OpenMailslot(); if(hmailslot==NULL) return FALSE; strcpy(buffer,MC_HEADER); size = strlen(buffer); WriteMailslot(hmailslot,buffer,size); strcpy(buffer,MC_FILES); size = strlen(buffer); WriteMailslot(hmailslot,buffer,size); sprintf(buffer,"%d",nfiles); size = strlen(buffer); WriteMailslot(hmailslot,buffer,size); for(i=0;i<nfiles;i++){ char filepath[1024]; char *p;// if(url_check_type(files[i])==-1 && GetFullPathName(files[i],1000,filepath,&p)!=0){ if(isURLFile(files[i])==FALSE && GetFullPathName(files[i],1000,filepath,&p)!=0){ size = strlen(filepath); WriteMailslot(hmailslot,filepath,size); } else { size = strlen(files[i]); WriteMailslot(hmailslot,files[i],size); } } CloseMailslot(hmailslot); return TRUE;}int SendCommandNoParamOldTiMidity(char *command){ HANDLE hmailslot; char buffer[1024]; int size; hmailslot = OpenMailslot(); if(hmailslot==NULL) return FALSE; strcpy(buffer,MC_HEADER); size = strlen(buffer); WriteMailslot(hmailslot,buffer,size); strcpy(buffer,command); size = strlen(buffer); WriteMailslot(hmailslot,buffer,size); strcpy(buffer,"0"); size = strlen(buffer); WriteMailslot(hmailslot,buffer,size); CloseMailslot(hmailslot); return TRUE;}int TerminateOldTiMidity(void){ return SendCommandNoParamOldTiMidity(MC_TERMINATE);}int ClearPlaylistOldTiMidity(void){ return SendCommandNoParamOldTiMidity(MC_PLAYLIST_CLEAR);}int PlayOldTiMidity(void){ return SendCommandNoParamOldTiMidity(MC_PLAY);}int PlayNextOldTiMidity(void){ return SendCommandNoParamOldTiMidity(MC_PLAY_NEXT);}int PlayPrevOldTiMidity(void){ return SendCommandNoParamOldTiMidity(MC_PLAY_PREV);}int StopOldTiMidity(void){ return SendCommandNoParamOldTiMidity(MC_STOP);}int PauseOldTiMidity(void){ return SendCommandNoParamOldTiMidity(MC_PAUSE);}// 俀廳婲摦帪偺張棟// opt==0 : 僼傽僀儖傪屆偄 TiMidity 偵搉偟偰帺暘偼廔椆丅屆偄 TiMidity 偑側偄偲偒偼帺暘偑婲摦丅// 屆偄僾儗僀儕僗僩偼僋儕傾偡傞丅// opt==1 : 僼傽僀儖傪屆偄 TiMidity 偵搉偟偰帺暘偼廔椆丅屆偄 TiMidity 偑側偄偲偒偼帺暘偑婲摦丅// 屆偄僾儗僀儕僗僩偼僋儕傾偟側偄丅// opt==2 : 屆偄 TiMidity 傪廔椆偟偰丄帺暘偑墘憈偡傞// opt==3 : 帺暘偼壗傕偣偢廔椆// opt==4 : 屆偄 TiMidity 傪廔椆偟偰丄帺暘偼壗傕偣偢廔椆// opt==5 : 俀廳偵婲摦偡傞// 帺暘偑廔椆偡傞傋偒偲偒偼 FALSE 傪曉偡// 帺暘偑廔椆偡傞傋偒偱側偄偲偒偼 TRUE 傪曉偡int w32gSecondTiMidity(int opt, int argc, char **argv){ int i; switch(opt){ case 0: case 1: if(ExistOldTiMidity()==TRUE){ if(opt==0) ClearPlaylistOldTiMidity(); SendFilesToOldTiMidity(argc > 0 ? argc-1 : 0, argv+1); return FALSE; } else { if(TryUniqTiMidity(20)==TRUE){ w32gStartMailslotThread(); return TRUE; } return FALSE; } case 2: if(ExistOldTiMidity()==TRUE){ for(i=0;i<=20;i++){ TerminateOldTiMidity(); if(UniqTiMidity()==TRUE){ w32gStartMailslotThread(); return TRUE; } Sleep(1000); } } else { if(TryUniqTiMidity(20)==TRUE){ w32gStartMailslotThread(); return TRUE; } } return FALSE; case 3: return FALSE; case 4: if(ExistOldTiMidity()==TRUE){ for(i=0;i<=20;i++){ TerminateOldTiMidity(); if(ExistOldTiMidity()==FALSE){ return FALSE; } Sleep(1000); } } return FALSE; case 5: return TRUE; default: return FALSE; }}// w32gSecondTiMidity() 偺屻張棟int w32gSecondTiMidityExit(void){ MailslotThreadTeminateFlag = TRUE; Sleep(300); if(hMailslot!=NULL) CloseHandle(hMailslot); ReleaseMutex(hMutexTiMidity); CloseHandle(hMutexTiMidity); return 0;}// Before it call timidity_start_initialize()int isURLFile(char *filename){ if(strncasecmp(filename,"http://",7)==0 || strncasecmp(filename,"ftp://",6)==0 || strncasecmp(filename,"news://",7)==0 || strncasecmp(filename,"file:",5)==0 || strncasecmp(filename,"dir:",4)==0){ return TRUE; } else { return FALSE; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -