qmplugin.cpp

来自「AppWizard has created this QMPlugin DLL 」· C++ 代码 · 共 211 行

CPP
211
字号
/*********************************************************************
	这里是按键精灵的插件模板
	欢迎您为按键精灵制作插件!
	这个模板是使用标准C++编写的
	褚瑞  2005.3
*********************************************************************/

#include "stdafx.h"
#include "stdio.h"
#include "QMPlugin.h"
#include "CmdInfo.h"
#include "shlobj.h"
#include "Commdlg.h"

/*********************************************************************
	欢迎您为按键精灵制作插件!
	按键精灵的每个插件可以支持若干条命令。
	如果您需要写一条自己的命令,需要遵循以下步骤:
	1. 打开文件QMPlugin.cpp
	2. 翻页到最后,找到表格g_CommandTable,仔细阅读相关说明
	3. 在表格g_CommandTable中填写一行,包括命令名称、说明和处理函数
	4. 仿照下面的函数Test1Handler或者Test2Handler编写你自己的处理函数
	5. 编译形成DLL文件,把DLL文件改成你喜欢的,不会和别人冲突的名字,把文件放在按键精灵的Plugin目录下
	6. 打开按键精灵,进入编辑脚本界面,打开“插件命令”面板,编写脚本测试你的插件!
	如果有不明白的地方,欢迎发email到rchu@vrbrothers.com询问。祝你成功!
	褚瑞  2005.3
*********************************************************************/

//这是关于插件的一些描述信息,请根据你的插件的具体情况来替换下面的中文文字。
extern char *g_lpszPluginDescription = "文件操作的插件";

int ExistFile(char *lpszParamList, char *lpszRetVal)
{
	DWORD dwFileAttr = GetFileAttributes(lpszParamList);		//只有一个字符串参数,可以不用分割参数了
	if(dwFileAttr & FILE_ATTRIBUTE_DIRECTORY)		//是文件夹
		return 2;
	else if(dwFileAttr > 0)							//是文件
		return 1;
	else 
		return 0;									//出错或者没有找到
}

int SelectDirectory(char *lpszParamList, char *lpszRetVal)
{
	BROWSEINFO sBrowseDirectoryInfo = {0};
	LPITEMIDLIST lpSelectDirectoryReturn = NULL;

	sBrowseDirectoryInfo.lpszTitle = "";
	sBrowseDirectoryInfo.ulFlags = BIF_RETURNONLYFSDIRS;

	lpSelectDirectoryReturn = SHBrowseForFolder(&sBrowseDirectoryInfo);
	if(lpSelectDirectoryReturn == NULL)		//没有作出选择(如选择了“取消”)
		return 0;
	SHGetPathFromIDList(lpSelectDirectoryReturn,lpszRetVal);	//这里会修改lpszRetVal,因此这个插件命令将返回一个字符串
	return 0;
}

int SelectFile(char *lpszParamList, char *lpszRetVal)
{
	char lpszBuffer[4096] = {0};
	OPENFILENAME sOpenFileDialogInfo = {0};
	sOpenFileDialogInfo.lStructSize = sizeof(sOpenFileDialogInfo);
	sOpenFileDialogInfo.lpstrFile = lpszBuffer;
	sOpenFileDialogInfo.nMaxFile = sizeof(lpszBuffer);
	sOpenFileDialogInfo.Flags = 6148;
	
	if(GetOpenFileName(&sOpenFileDialogInfo) == 0)		//如果选择了"取消"
		return 0;
	strcpy(lpszRetVal,lpszBuffer);			//复制到lpszRetVal,,因此这个插件命令将返回一个字符串
	return 0;
}

int ReadINI(char *lpszParamList, char *lpszRetVal)
{
	char lpszSectionName[1024] = {0}, lpszKeyName[1024] = {0}, lpszINIFilePath[1024] = {0};
	ParseParam(lpszParamList,lpszSectionName,lpszKeyName,lpszINIFilePath);
	char lpszBuffer[4096] = {0};
	
	GetPrivateProfileString(lpszSectionName,lpszKeyName,"",lpszBuffer,sizeof(lpszBuffer),lpszINIFilePath);
	strcpy(lpszRetVal,lpszBuffer);			//复制到lpszRetVal,,因此这个插件命令将返回一个字符串

	return 0;
}

int WriteINI(char *lpszParamList, char *lpszRetVal)
{
	char lpszSectionName[1024] = {0}, lpszKeyName[1024] = {0}, lpszINIFilePath[1024] = {0};
	char lpszBuffer[4096] = {0};
	ParseParam(lpszParamList,lpszSectionName,lpszKeyName,lpszBuffer,lpszINIFilePath);
	return WritePrivateProfileString(lpszSectionName,lpszKeyName,lpszBuffer,lpszINIFilePath);
}

int CopyFile_(char *lpszParamList, char *lpszRetVal)
{	//以下函数的名字后面加下划线,是为了和系统的同名API函数区分
	char lpszTargetFile[2048] = {0}, lpszSourceFile[2048] = {0};
	ParseParam(lpszParamList,lpszSourceFile,lpszTargetFile);
	return CopyFile(lpszSourceFile,lpszTargetFile,FALSE);
}

int MoveFile_(char *lpszParamList, char *lpszRetVal)
{
	char lpszTargetFile[2048] = {0}, lpszSourceFile[2048] = {0};
	ParseParam(lpszParamList,lpszSourceFile,lpszTargetFile);
	return MoveFile(lpszSourceFile,lpszTargetFile);
}

int DeleteFile_(char *lpszParamList, char *lpszRetVal)
{
	return DeleteFile(lpszParamList);
}

int OpenFile_(char *lpszParamList, char *lpszRetVal)
{
	return (int)CreateFile(lpszParamList,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
}

int CloseFile_(char *lpszParamList, char *lpszRetVal)
{
	return CloseHandle((HANDLE)atoi(lpszParamList));
}

int ReadFile_(char *lpszParamList, char *lpszRetVal)
{
	char lpszHandle[16] = {0}, lpszReadLength[16] = {0};
	ParseParam(lpszParamList,lpszHandle,lpszReadLength);
	DWORD dwNumberOfBytesRead;

	ReadFile((HANDLE)atoi(lpszHandle),lpszRetVal,atoi(lpszReadLength),&dwNumberOfBytesRead,NULL);
	lpszRetVal[dwNumberOfBytesRead] = 0;   //加上字符串结束标示
	return 0;
}

int ReadLine(char *lpszParamList, char *lpszRetVal)
{
	DWORD dwNumberOfBytesRead;
	char *lpszCurrentReadPos = lpszRetVal;

	//windows api居然没有读取一行的函数,只好自己写了。效率可能有点低,将就着用吧
	do 
	{
		ReadFile((HANDLE)atoi(lpszParamList),lpszCurrentReadPos,1,&dwNumberOfBytesRead,NULL);
		if(*lpszCurrentReadPos++ == '\n')	//读到行末
			break;
	} while(dwNumberOfBytesRead);
	*lpszCurrentReadPos = 0;	//加上字符串结束标示
	return 0;
}

int WriteFile_(char *lpszParamList, char *lpszRetVal)
{
	char lpszHandle[16] = {0}, lpszWriteContent[65536];
	ParseParam(lpszParamList,lpszHandle,lpszWriteContent);
	DWORD dwNumberOfBytesWrite;

	return WriteFile((HANDLE)atoi(lpszHandle),lpszWriteContent,strlen(lpszWriteContent),&dwNumberOfBytesWrite,NULL);
}

int WriteLine(char *lpszParamList, char *lpszRetVal)
{
	char lpszHandle[16] = {0}, lpszWriteContent[65536];
	ParseParam(lpszParamList,lpszHandle,lpszWriteContent);
	DWORD dwNumberOfBytesWrite;

	strcat(lpszWriteContent,"\r\n");	//和WriteFile的唯一区别是后面多了回车换行符
	return WriteFile((HANDLE)atoi(lpszHandle),lpszWriteContent,strlen(lpszWriteContent),&dwNumberOfBytesWrite,NULL);
}

int SeekFile(char *lpszParamList, char *lpszRetVal)
{
	char lpszHandle[16] = {0}, lpszOffset[16] = {0};
	ParseParam(lpszParamList,lpszHandle,lpszOffset);

	SetFilePointer((HANDLE)atoi(lpszHandle),atoi(lpszOffset),NULL,FILE_BEGIN);
	return 0;
}

int GetFileLength(char *lpszParamList, char *lpszRetVal)
{
	return GetFileSize((HANDLE)atoi(lpszParamList),NULL);
}
/*********************************************************************
 * 名称:g_CommandTable
 * 说明:这是一个struct数组,数组中的每一个元素代表了本插件支持的一条命令。数组的元素数目就是本插件支持的命令数目
 * 每个struct中有4个成员,分别是命令名称(如下面的"Test1"),命令的中文解释(如下面的"测试1"),命令的执行函数(如下面的Test1Handler),命令的参数个数(如下面的2)
 * 你可以把它看成一个表格,表格中的每一行代表了一条插件命令。当你需要新增一条插件命令的时候,就需要在表格里面加一行。
 * 作者: 褚瑞 
 * 时间 : 2005-03-30 19:56:25 
*********************************************************************/
QMPLUGIN_CMD_INFO g_CommandTable[] =
{
	"ExistFile","判断文件或文件夹是否存在(文件路径)[返回=0:不存在,1:存在文件,2:存在文件夹]",ExistFile,1,
	"SelectDirectory","弹出选择目录对话框,返回所选择的路径",SelectDirectory,0,
	"SelectFile","弹出选择文件对话框,返回所选择的文件全路径",SelectFile,0,
	"CopyFile","复制一个文件(要复制的文件,要复制的目标)",CopyFile_,2,
	"MoveFile","移动一个文件(要移动的文件,要移动的目标)",MoveFile_,2,
	"DeleteFile","删除一个文件(要删除的文件)",DeleteFile_,1,
	"ReadINI","读一个INI文件(小节名,键名,INI文件路径)[返回读出内容]",ReadINI,3,
	"WriteINI","写一个INI文件(小节名,键名,要写的内容,INI文件路径)",WriteINI,4,
	"OpenFile","打开一个文件(文件路径)[返回=-1:打开失败,其他:文件的句柄]",OpenFile_,1,
	"CloseFile","关闭一个打开的文件(文件句柄)",CloseFile_,1,
	"ReadFile","从文件当前位置读取一定长度(文件句柄,读取长度)[返回读取的内容]",ReadFile_,2,
	"ReadLine","从文件当前位置读一行内容(文件句柄)[返回读取的内容]",ReadLine,1,
	"WriteFile","往文件当前位置写入一个字符串(文件句柄,要写入的字符串)",WriteFile_,2,
	"WriteLine","往文件当前位置写一个字符串并换行(文件句柄,要写入的字符串)",WriteLine,2,
	"SeekFile","设置当前文件读写位置(文件句柄,相对文件头的读写位置)",SeekFile,2,
	"GetFileLength","得到文件长度(文件句柄)[返回文件长度]",GetFileLength,1,
};

//计算本插件支持的所有命令的个数
int g_iCommandCount = sizeof(g_CommandTable) / sizeof(QMPLUGIN_CMD_INFO);

⌨️ 快捷键说明

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