1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2019 年 8 月 30 日 |
---|
#2243 in 开发工具
53KB
145 行
wcxhead.rs
为 Total Commander 打包插件定义错误代码、标志和回调函数
文档
示例
使用此软件包的插件可以在这里找到。
特别感谢
感谢所有在 Patreon 上支持进一步开发的人,特别是
- ThePhD
lib.rs
:
wcxhead.h 文件的内容。它包含错误代码、标志和回调函数的定义
错误代码
当您想通知 Totalcmd 发生错误时,请使用以下值。
常量 | 值 | 描述 |
---|---|---|
0 | 成功 | |
E_END_ARCHIVE | 10 | 归档中没有更多文件 |
E_NO_MEMORY | 11 | 内存不足 |
E_BAD_DATA | 12 | 当前解压缩文件数据中的 CRC 错误 |
E_BAD_ARCHIVE | 13 | 整个归档损坏,例如损坏的头部 |
E_UNKNOWN_FORMAT | 14 | 归档格式未知 |
E_EOPEN | 15 | 无法打开现有文件 |
E_ECREATE | 16 | 无法创建文件 |
E_ECLOSE | 17 | 关闭文件时发生错误 |
E_EREAD | 18 | 从文件读取时发生错误 |
E_EWRITE | 19 | 向文件写入时发生错误 |
E_SMALL_BUF | 20 | 缓冲区太小 |
E_EABORTED | 21 | 函数被用户中止 |
E_NO_FILES | 22 | 未找到文件 |
E_TOO_MANY_FILES | 23 | 文件太多,无法打包 |
E_NOT_SUPPORTED | 24 | 不支持该功能 |
Unicode 支持
从 Total Commander 7.5(打包插件接口 2.20)开始,所有插件类型都添加了对 Unicode 的支持。原则上,您需要实现与 ANSI 相同的函数,但有两点不同:函数名称从 FunctionName 更改为 FunctionNameW,并且 ANSI 字符串更改为宽字符名称。
Total Commander 将在所有基于 NT 的系统(Windows NT、2000、XP)上调用 Unicode 函数(如果存在)。如果没有,或者在 Windows 9x/ME 上,Total Commander 将调用 ANSI 函数。
以下打包插件接口的函数支持 Unicode
OpenArchiveW
ReadHeaderExW
ProcessFileW
SetChangeVolProcW
SetProcessDataProcW
PackFilesW
DeleteFilesW
StartMemPackW
CanYouHandleThisFileW
以下函数不存在Unicode形式,必须以Ansi形式实现
ReadHeader - 使用ReadHeaderEx
CloseArchive
GetPackerCaps
ConfigurePacker
PackToMem
DoneMemPack
PackSetDefaultParams
ReadHeaderEx
如何在现有插件中支持Unicode的最简单方法是什么?
-
即使您编写的是不同类型的插件,也可以获取我的示例插件fsplugin(文件系统插件部分)!
-
将cunicode.h和cunicode.cpp文件添加到您的项目中。它们包含使Unicode支持更简单的各种函数。
-
将现有函数转换为Unicode,并将它们重命名为FunctionNameW。对于所有文件函数,如CreateFile,不要直接调用它们的Unicode对应项CreateFileW。相反,调用cunicode.cpp中的函数,如CreateFileT。这些函数会自动调用正确的Unicode或Ansi函数,甚至支持文件名长度>259个字符!
-
对于每个转换后的函数FunctionNameW,重新创建一个FunctionName函数,您可以通过这种方式调用它
int __stdcall FunctionName(char* SomeString1,char* SomeString2)
{
WCHAR SomeString1W[wdirtypemax],SomeString2W[wdirtypemax];
return FunctionNameW(awfilenamecopy(SomeString1W,SomeString1),awfilenamecopy(SomeString2W,SomeString2));
}
宏awfilenamecopy将Ansi字符串SomeString1转换为Unicode,并存储在SomeString1W中。此变量不能是指针,因为awfilenamecopy使用"countof"来获取目标长度。
64位支持
在Total Commander 8中,Total Commander现在也提供64位版本。由于插件是简单的dll,64位程序只能加载64位dll,因此插件需要用64位编译器重新编译才能与64位Total Commander一起使用。
重要:64位插件必须与32位插件具有相同的名称,并在同一目录中,但扩展名后必须附加'64'。例如:filesystem.wcx -> filesystem.wcx64。仅64位插件也必须以'64'结尾。
由于所有64位Windows版本都支持Unicode,因此只需编写64位Unicode插件就足够了。但是,如果您的现有32位插件仅支持ANSI函数,则可以不进行修改将其移植到64位。Total Commander 64位也支持ANSI函数,如果找不到Unicode函数。64位Unicode插件没有以'u'开头的扩展名,它们有正常的'wcx64'扩展名。
一些移植说明
插件函数中的所有整数参数仍然是32位的(例如,在C中:int,long,DWORD;Delphi:integer,dword),现在只有指针和句柄是64位宽的。使用64位编译器重新编译程序或dll通常可以自动处理这一点,无需进行许多更改。在将指针转换为整数或相反的情况下可能会出现问题。请确保使用64位整数变量(例如,C中的size_t,Lazarus中的ptrint或ptruint)进行此类操作。
如何将现有插件转换为64位的最简单方法是什么?
1. 如果插件是用C或C++编写的
如果您有Visual Studio Professional 2005或更高版本,64位编译器已经包含在内。如果您使用的是免费的Express版本或Visual Studio 2003,除了Visual Studio Express外,您还需要安装Windows软件开发工具包(SDK)。
以下是如何将64位支持添加到现有插件的方法
-
检查Visual Studio的工具栏:这里有一些用于编译类型(调试或发布)的组合框,以及一个显示“Win32”的组合框。
-
打开显示“Win32”的组合框,然后单击“配置管理器”。
-
单击“活动解决方案平台列表”中的“新”(右侧)。将显示一个新的对话框“新解决方案平台”。
-
在上面的字段中,选择“x64”
-
在下方的字段中,“从”选择“Win32”
-
确保“创建新项目平台”复选框已选中
-
单击确定
另请参阅:http://msdn.microsoft.com/en-us/library/9yb4317s.aspx -
现在您可以在同一项目中在Win32和x64之间切换。切换到x64。
-
打开您项目的设置。
-
您应该设置以下选项
C++ - 代码生成 - 运行库:多线程调试 (/Mtd) <- 不是多线程调试的dll !
链接器 - 通用 - 输出文件:wcx/pluginname.wcx64
下载链接
- Visual Studio Express C++版本
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express - Windows软件开发工具包(SDK)
http://msdn.microsoft.com/en-us/windows/bb980924.aspx
2. 如果插件是用Delphi或Free Pascal编写的
有64位的Lazarus/Free Pascal可用,可以用来创建64位的dll。Total Commander本身就是用Lazarus编译成64位应用程序的。在“工具”菜单中有将Delphi项目和表单转换为Lazarus的菜单项。
Lazarus/Free Pascal的工作方式与Delphi略有不同,因此可能需要更改一些函数。以下是移植Total Commander时遇到的问题
- Free Pascal不同 -> 在所有 *.pas 文件中使用 {$MODE Delphi} 以Delphi方式处理函数
- strnew当传递的pchar为0字节长时创建一个NIL指针。 -> 使用您自己的strnew函数。
- 低于WM_USER的Windows消息不会传递给窗口过程。 -> 使用SetWindowLongPtr来 subclass 窗口
- 当p是pwidechar,buffer是宽字符数组时,p缓冲区计算不工作 -> 使用 p-pwidechar(@buffer)
- 在lcltype.pp!中将INVALID_HANDLE_VALUE不正确地设置为0而不是-1 -> 在"uses"命令的末尾添加"windows"。
下载链接
您应该从以下链接下载并安装64位每日快照
http://www.lazarus.freepascal.org/
点击“每日快照”,然后点击例如Lazarus + fpc 2.4.4 win64
最终版本非常过时,因此快照通常工作得更好。
示例
使用此软件包的插件可以在这里找到。
特别感谢
向所有支持在Patreon上进一步开发的人表示感谢,特别是
- ThePhD