博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定制Notepad++插件实现Fastinfoset显示
阅读量:2381 次
发布时间:2019-05-10

本文共 4537 字,大约阅读时间需要 15 分钟。

设计流程

具体流程

  1. 利用开源jar包,jRE自带的sax解析器实现把Fastinfoset文档转换成XML文档。
  2. 生成JAR包。
  3. 下载现有的Notepad++开发模板,修改模板,调用JAR包实现FIS转换

参考网址


java实现FIS到XML

部分代码

InputStream bis = new BufferedInputStream(new FileInputStream(args[0]),2048);        OutputStream xmlDocument = new ByteArrayOutputStream();        // Create the transformer        Transformer tx = TransformerFactory.newInstance().newTransformer();        // Transform to convert the FI document to an XML document        tx.transform(new FastInfosetSource(bis), new StreamResult(xmlDocument));        byte[] b=((ByteArrayOutputStream) xmlDocument).toByteArray();        String rtStr= new String(b, "GB2312");

代码实现

生成JAR包

有外部依赖JAR包,可以手工配置MANIFEST.MF,

编写格式
第一行不能空,行与行之间不能有空行,每一行的最后一个字符不能是空格
最后一行一定是空行
每个属性的名称和值之间(冒号后面)一定要有空格
文件的每一行都不能超过72个字节(一般是70个ASCII字母加上回车换行符);如果72个字节不够用,则另起一行并以空格开头:以空格开头的行都被视为前一行的续行。
demo格式:

Manifest-Version: 1.0Class-Path: FastInfoset-1.2.9.jar sax2.jarMain-Class: FIS.FIS

参考资料


c++调用JAR

具体流程

CreateProcess

使用CreateProcess,可以解决system()弹出控制台的问题。

CreatePipe

利用管道共享内存,实现进程间通信。获得子进程的返回结果

WaitForSingleObject

应为子进程的调用是异步调用,使用WaitForSingleObject等待子进程执行完成。

实现代码

int _tmain(int argc, _TCHAR* argv[]){    TCHAR cmdline1[] = TEXT("java -jar fasttoxml.jar E:\\Study\\Ctrip\\FISerialization\\FISerialization\\bin\\Debug\\Noemax.FastInfoset.Net41.fi");    string buffer = call(cmdline1);    int lll = buffer.size();    int len = strlen(buffer.c_str());    char *dd = (char*)malloc((len + 1)*sizeof(char));    strcpy_s(dd, len + 1, buffer.c_str());    printf("%s", dd);    system("pause");}char* call(TCHAR cmdline[]){    SECURITY_ATTRIBUTES   sa;    HANDLE   hRead, hWrite;    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);    sa.nLength = sizeof(SECURITY_ATTRIBUTES);    sa.lpSecurityDescriptor = NULL;    sa.bInheritHandle = TRUE;    if (!CreatePipe(&hRead, &hWrite, &sa, 0))    {        return   0;    }    STARTUPINFO   si;    PROCESS_INFORMATION   pi;    // Set up members of the PROCESS_INFORMATION structure.     ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));    // Set up members of the STARTUPINFO structure.     ZeroMemory(&si, sizeof(STARTUPINFO));    si.cb = sizeof(STARTUPINFO);    GetStartupInfo(&si);    si.hStdError = hWrite;    si.hStdOutput = hWrite;    si.hStdInput = hRead;    si.wShowWindow = SW_HIDE;    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;    //TCHAR cmdline[] = TEXT("ipconfig ");    //关键步骤,CreateProcess函数参数意义请查阅MSDN         //cmdline  必须是传形参    if (!CreateProcess(NULL, cmdline, NULL, NULL, true, NULL, NULL, NULL, &si, &pi))    {        return   0;    }    CloseHandle(hWrite);    char buffer[MAX_SIZE];    DWORD   bytesRead, dwWritten;    std::string s3s = "";    WaitForSingleObject(pi.hProcess, INFINITE);    while (true)    {        if (!ReadFile(hRead, buffer, MAX_SIZE, &bytesRead, NULL) ||            bytesRead == 0)        {            break;        }        else        {            buffer[bytesRead] = '\0';        }        /*if (!WriteFile(hStdout, buffer, bytesRead, &dwWritten, NULL))        break;*/        s3s = buffer;    }    int len = s3s.size();    return buffer;}

具体示例代码


notepad++插件开发

具体流程说明

Notepad++ 开发的要点主要分布在以下几个接口中,描述如下:

插件的名称和自我描述,这一部分定义了插件在 plugin 菜单的显示,包括入口名称和子菜单条目。一般来说入口的名称显示在菜单向上,Notepad++ 定义了一个全局变量 NPP_PLUGIN_NAME 来描述这个名称,我们只需要更改它即可
。所有的插件依赖 UI 的 plugin 菜单来激发一个特定的任务,所有的菜单初始化选项必须在 commandMenuInit 函数中完成。利用 Notepad++暴露的方法 setCommand 方法,可以把菜单项与插件自定的方法体关联起来,setCommand 的方法定义如下:
清单 3. setCommand 定义

bool setCommand(size_t index,                 TCHAR *cmdName,                 PFUNCPLUGINCMD pFunc,                 ShortcutKey *sk = NULL,                 bool check0nInit = false);

其中的参数意义如下 :

index:从零开始,表示菜单项目的顺序;

commandName: 显示在菜单上的名称;
functionPointer: 函数指针,表示函数的确切地址;
shortcut: 可选择,快捷键定义;
check0nInit: 可选择,定义这个菜单项是否为默认已选择条目。

利用 setCommand 函数所设置的相会自动显示在已定义的插件菜单条目中。

与 Notepad++的交互。在自定义的函数体内,可以获取 Notepad++的句柄,用来设置一些全局的条目,利用模板中定义好的导出函数 setInfo,Notepad++ 程序就会给插件提供一个 NppData 结构实例,其中就有当前 Notepad++的句柄。在本文中所示的插件视线中,打开 FastInfoset文件后,为了显示 XML 着色,必须发送一条切换语言的消息如下:
清单 4. 发送消息到 Notepad++

::SendMessage(nppData._nppHandle,NPPM_SETCURRENTLANGTYPE,0,(LPARAM)LangType::L_XML);

这样就可以在打开 FastInfoset 文件立刻切换至 XML 语言。 更重要的,插件需要与 Scintilla 控件交互,为了获取 Scintilla 的句柄,需要对 Notepad++ 程序问询,使得 Notepad++ 能够返回当前需要的 Scintilla 句柄。有了 Scintilla 句柄 ,就可以通过多种消息来控制显示和获取当前的文本了。

清单 5. 设置文本

// 设置文本 ::SendMessage(curScintilla, SCI_SETTEXT, 0, (LPARAM)str);

清单 6. 获取文本

// 获取文本 ::SendMessage(curScintilla, SCI_GETTEXT, (WPARAM)(Length+1), (LPARAM)str);

需要说明的是,文本的获取必须传递文本的大小和存储缓存,文本大小可以通过 SCI_GETLENGTH 消息来取得。

notepad++插件模板

本文实现的notepad++插件源码

插件相关文档


插件下载地址

转载地址:http://qgkab.baihongyu.com/

你可能感兴趣的文章
冒号和他的学生们(连载2)——首轮提问
查看>>
正则表达式与文件格式化处理
查看>>
Java EE互联网轻量级框架整合开发
查看>>
Java语言程序设计(基础篇)
查看>>
大型网站技术架构:核心原理与案例分析
查看>>
JAVA并发编程实战
查看>>
RabbitMQ实战++高效部署分布式消息队列
查看>>
微服务设计
查看>>
Spring Cloud微服务实战
查看>>
C++ static 语义
查看>>
C++ static 语义
查看>>
Linux Cgroups概述
查看>>
centos7 硬盘性能测试
查看>>
cgroup使用--cpu资源限制
查看>>
cgroup使用--memory资源限制
查看>>
Redis 单机环境搭建
查看>>
elasticsearch 单机环境搭建
查看>>
spark 独立模式部署
查看>>
Redis 基础命令 --- String篇
查看>>
Redis 基础命令 --- Hash篇
查看>>