#plugin #file #commander #total #callback #error #definition

wcxhead

为 Total Commander 打包插件定义错误代码、标志和回调函数

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2019 年 8 月 30 日

#2243 in 开发工具

MIT 许可证

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的最简单方法是什么?

  1. 即使您编写的是不同类型的插件,也可以获取我的示例插件fsplugin(文件系统插件部分)!

  2. 将cunicode.h和cunicode.cpp文件添加到您的项目中。它们包含使Unicode支持更简单的各种函数。

  3. 将现有函数转换为Unicode,并将它们重命名为FunctionNameW。对于所有文件函数,如CreateFile,不要直接调用它们的Unicode对应项CreateFileW。相反,调用cunicode.cpp中的函数,如CreateFileT。这些函数会自动调用正确的Unicode或Ansi函数,甚至支持文件名长度>259个字符!

  4. 对于每个转换后的函数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位支持添加到现有插件的方法

  1. 检查Visual Studio的工具栏:这里有一些用于编译类型(调试或发布)的组合框,以及一个显示“Win32”的组合框。

  2. 打开显示“Win32”的组合框,然后单击“配置管理器”。

  3. 单击“活动解决方案平台列表”中的“新”(右侧)。将显示一个新的对话框“新解决方案平台”。

  4. 在上面的字段中,选择“x64”

  5. 在下方的字段中,“从”选择“Win32”

  6. 确保“创建新项目平台”复选框已选中

  7. 单击确定
    另请参阅:http://msdn.microsoft.com/en-us/library/9yb4317s.aspx

  8. 现在您可以在同一项目中在Win32和x64之间切换。切换到x64。

  9. 打开您项目的设置。

  10. 您应该设置以下选项
    C++ - 代码生成 - 运行库:多线程调试 (/Mtd) <- 不是多线程调试的dll !
    链接器 - 通用 - 输出文件:wcx/pluginname.wcx64

  1. Visual Studio Express C++版本
    http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
  2. 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时遇到的问题

  1. Free Pascal不同 -> 在所有 *.pas 文件中使用 {$MODE Delphi} 以Delphi方式处理函数
  2. strnew当传递的pchar为0字节长时创建一个NIL指针。 -> 使用您自己的strnew函数。
  3. 低于WM_USER的Windows消息不会传递给窗口过程。 -> 使用SetWindowLongPtr来 subclass 窗口
  4. 当p是pwidechar,buffer是宽字符数组时,p缓冲区计算不工作 -> 使用 p-pwidechar(@buffer)
  5. 在lcltype.pp!中将INVALID_HANDLE_VALUE不正确地设置为0而不是-1 -> 在"uses"命令的末尾添加"windows"。

您应该从以下链接下载并安装64位每日快照
http://www.lazarus.freepascal.org/
点击“每日快照”,然后点击例如Lazarus + fpc 2.4.4 win64
最终版本非常过时,因此快照通常工作得更好。

示例

使用此软件包的插件可以在这里找到。

特别感谢

向所有支持在Patreon上进一步开发的人表示感谢,特别是

  • ThePhD

依赖项