修改exe资源中的字符串

2023-12-13

我该如何修改buffer在下面的代码中然后保存可执行文件资源中的更改?我正在寻找类似的东西SetString(handle,index,buffer,size).

var
  hExe : Cardinal;
  buffer : array [0..4097] of ansichar;
begin
  hExe:=LoadLibraryEx(PAnsiChar(Edit2.Text),0,LOAD_LIBRARY_AS_DATAFILE);
  LoadString(hExe,65300,buffer,SizeOf(buffer));
  ShowMessage(buffer);
  //need to modify buffer here then I'll unload the resources..
end;

Update:这是我对 UpdateResource 的尝试

var
  hEXE: DWORD;
  pData: PAnsiChar;
begin
  pData := PAnsiChar(Edit1.Text);
  hEXE := BeginUpdateResource(pchar(edit2.text), FALSE);
  if hEXE <> 0 then
  begin
    UpdateResource(hEXE, RT_string, MAKEINTRESOURCE(4082), LANG_NEUTRAL,
      @pData, Length(pData)); //if i change 4082 to 65300 it creates another key like 4082
    EndUpdateResource(hEXE, FALSE);
  end;

这段代码搞乱了整个 4082 的内容。问题是 RT_STRING 中名为 4082 的项目是字符串组。当我在资源编辑器中打开 exe 时,单击字符串表,然后单击 4082,结果是:

STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
65296,  "Unicode"
65297,  "Big Endian Unicode"
65298,  "UTF-8"
65299,  "UTF-7"
65300,  "ABCDE12345"
}

因此,我要么需要解析字符串组,要么需要一个 API 来设置组中索引为 65300 的修改字符串。有任何想法吗?


我发现了答案使用谷歌。 (从中文翻译成英文)无论如何谢谢大家!

procedure UpdateResString(AFileName, ANewString: string; AStringIdent: Integer);
  procedure WriteToArray(AArray: TByteDynArray; AData: Word; var APos: Integer);
  begin
    AArray[APos] := Lo(AData);
    AArray[APos + 1] := Hi(AData);
    Inc(APos, 2);
  end;

  function ReadFromArray(AArray: TByteDynArray; APos: Integer): Word;
  begin
    Result := AArray[APos] + AArray[APos + 1] * 16;
  end;

var
  hModule, hResInfo, hUpdate: THandle;
  ResData, TempData: TByteDynArray;
  wsNewString: WideString;
  iSection, iIndexInSection: Integer;
  i, iLen, iSkip, iPos: Integer;
begin
  hModule := LoadLibrary(PChar(AFileName));
  if hModule = 0 then
    raise Exception.CreateFmt('file %s failed to load.', [AFileName]);

  // Calculate the resource string area and the string index in that area
  iSection := AStringIdent div 16 + 1;
  iIndexInSection := AStringIdent mod 16;

  // If the resource already exists, then read it out of the original data
  hResInfo := FindResource(hModule, MakeIntResource(iSection), RT_STRING);
  if hResInfo <> 0 then
  begin
    iLen := SizeOfResource(hModule, hResInfo);
    SetLength(ResData, iLen);
    CopyMemory(ResData, LockResource(LoadResource(hModule, hResInfo)), iLen);
  end;
  // Should first close the file, and then update
  FreeLibrary(hModule);
  // Calculate the new data is written to location
  wsNewString := WideString(ANewString);
  iLen := Length(wsNewString);
  iPos := 0;
  for i := 0 to iIndexInSection do
  begin
    if iPos > High(ResData) then
      SetLength(ResData, iPos + 2);
    if i <> iIndexInSection then
    begin
      iSkip := (ReadFromArray(ResData, iPos) + 1) * 2;
      Inc(iPos, iSkip);
    end;
  end;

  // Delete the original data and the data behind the temporary
  // storage of data to be added
  iSkip := (ReadFromArray(ResData, iPos) + 1) * 2;
  TempData := Copy(ResData, iPos + iSkip, Length(ResData) - iSkip);
  SetLength(ResData, iPos);
  SetLength(ResData, iPos + (iLen + 1) * 2 + Length(TempData));

  // Write new data
  WriteToArray(ResData, iLen, iPos);
  for i := 1 to iLen do
    WriteToArray(ResData, Ord(wsNewString[i]), iPos);
  // Write back to the original data
  for i := 0 to High(TempData) do
    ResData[iPos + i] := TempData[i];

  // Write the data back to file
  hUpdate := BeginUpdateResource(PChar(AFileName), False);
  if hUpdate = 0 then
    raise Exception.CreateFmt(
      'cannot write file %s. Please check whether it is open or set read-only.',
      [AFileName]);

  UpdateResource(hUpdate, RT_STRING, MakeIntResource(iSection), LANG_NEUTRAL,
    ResData, Length(ResData));
  EndUpdateResource(hUpdate, False);
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改exe资源中的字符串 的相关文章

  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • WPF C# 无法找到子文件夹图像资源

    我在程序集中有几个图像 我已在其属性设置中将它们全部标记为资源 为了进行测试 我将图像放在项目的根目录中 Img Source new BitmapImage new Uri pack application MyAssembly comp
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 带位图的简单组合框

    如何将位图放入组合框中并将样式设置为简单 例如 Google Chrome 的右侧有星号 Firefox 的右侧有箭头 我尝试了这段代码 procedure TForm2 ComboBox1DrawItem Control TWinCont
  • 如何将 REST API 与 FireMonkey 结合使用?

    我需要在 FireMonkey 中实现 REST API 来获取一些信息 但我不确定如何做到这一点 REST API使用OAuth2 我可以访问两个代码 Consumer Key和Consumer Secret 之后 我需要获得一个临时的
  • C# CreatePipe() -> 受保护的内存错误

    我尝试使用 C 创建管道 代码非常简单 但是当行与CreatePipe 调用被执行我得到一个System AccessViolationException并出现以下错误消息 尝试读取或写入受保护的内存 这通常表明其他内存已损坏 这是我的表单
  • 如何仅使用 TADOQuery 组件将图像插入数据库

    我有一个简单的基本问题 我正在尝试使用将图像插入数据库Insert与其他列值的语句也使用TADOQuery成分 由于代码已经由某人编写 因此我想在此处放置一些虚拟示例代码 以供您澄清相应的步骤 请注意 这可以正常工作TQuery组件 因为我
  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • Sage One API - unsupported_grant_type

    我正在尝试通过以下方式获取 Sage One API 的访问令牌docs https developers sageone com docs en v1 authentication request access token using G
  • 有什么方法可以获取给定 Instagram 位置 id 的地方的 foursquare 场地 id 吗?

    Instagram 位置是从 foursquare 场地列表中选择的 并且绝对可以在给定 foursquare 场地 ID 的情况下搜索 Instagram 位置 但我有一篇 Instagram 帖子 想找到它对应的 foursquare
  • IB Java API:提取多个合约的股票数据(实时柱)

    我正在对算法交易和 IB API 进行一些自学和实验 我决定使用 Java 但我愿意切换到 C 我浏览了一个在线教程 该教程将引导您完成下面所示的代码 但我想知道是否可以将其扩展到一只股票之外 我想浏览所有 SP500 股票并检查股票数据
  • 运行 t4 脚本作为 resx 文件的自定义工具

    我有一个资源文件MyResource resx 我想改变MyResource Designer cs文件生成 我有一个 t4 脚本 它接受 resx 文件作为输入并给出结果转换 但是 我必须手动运行此 t4 才能使其工作 我看到 resx
  • 不断断点?如何去除它们?

    我下载了一个用Delphi 2009制作的项目 这也是我使用的 但是有一个断点我无法删除 如果我尝试删除它 它会在程序执行后再次执行 我在其他调试器中遇到了这样的事情 称为硬件断点 但这并不重要 如何删除断点 EDIT Article ht
  • 具有 csOwnerDrawFixed 样式的组合框如何表现得像 csDropDown 样式?

    我正在使用一个组合框 http docwiki embarcadero com Libraries en Vcl StdCtrls TComboBoxstyle 属性设置为的组件csOwnerDrawFixed 我实现了绘图项一切工作正常
  • Facebook 通过 API“Boost Post”?

    我一直在浏览文档 发现可以通过 Facebook 广告 API 实现 Boost Post 功能 但是 我在查找 Boost Post 到底有什么作用时遇到了一些困难 即 API 的哪一部分对应 Facebook UI 的 Boost Po
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • C# 如何使用 WM_GETTEXT / GetWindowText API / 窗口标题

    我想获取应用程序的控件 句柄的内容 这是实验代码 Process processes Process GetProcessesByName Notepad foreach Process p in processes StringBuild
  • 如何从 VCL.Graphics 获取所有已注册的文件格式...但 64 位

    在我的 32 位应用程序中 我使用FindRegisteredPictureFileFormats 单元由 Cosmin Prund 提供 https stackoverflow com a 14677532 505088 gt 如何从图形
  • HttpContext.GetGlobalResourceObject 始终返回 null

    我在 App GlobalResources 文件夹中创建了两个文件 SiteResources en US resx SiteResources sp SP resx 两者都包含 SiteTitleSeparator 的值 这是我想要做的
  • 如何更改 TPageControl 上标签的方向?

    我是 Delphi 的新手 再次强调 我在 1994 年就使用过 Delphi 我现在有 Delphi 2009 Pro 来自Java 我发现对象继承非常晦涩 我的用户想要选项卡位于左侧的选项卡式页面 但是 TPageControl 不允许

随机推荐

  • 为 UIAlertAction 编写处理程序

    我正在介绍一个UIAlertView给用户 我不知道如何编写处理程序 这是我的尝试 let alert UIAlertController title Title message Message preferredStyle UIAlert
  • Orion Context Broker 安装问题

    我们正在尝试按照此链接中的建议在 CentOS 7 虚拟机中安装 Orion Context Broker https fiware orion readthedocs io en master admin install index ht
  • 使用 WCF 接口

    我已经用谷歌搜索并阅读了几个小时 但找不到任何人可以处理我的具体情况 我想在 WCF 服务契约中使用接口来将服务与线路两端使用的类松散耦合 这将使我们能够拥有一个低级程序集 其中仅包含我们可以交给顾问的服务和数据契约 仅接口 在网络的一端
  • ggplot2 热图 2 种不同的配色方案 - 混淆矩阵:与错误分类不同的配色方案中的匹配

    我改编了混淆矩阵的热图这个答案 不过我想扭转它 在对角线中 从左上到右下 是匹配项 正确的分类 我的目标是在黄色调色板中绘制这条对角线 红色调色板中的不匹配 因此除了对角线中的瓷砖之外的所有瓷砖 In my plot cm函数我可以得到对角
  • sails:如何将数组的数组转换为json对象

    我正在尝试读取我上传的 xlsx find 并尝试将数组数组转换为 json 键值对对象 所以我正在尝试下面的代码片段 var fs uploadedFiles 0 fd var xlsxRows require xlsx rows var
  • ONVIF #PasswordDigest 的公式是什么

    我正在研究发送 GetDeviceInformation 的 ONVIF 这是必需的 wsse UsernameToken 经过查资料权威 有两个公式 1 通过 ONVIF Core Specification v241 pdf 5 12
  • 在Python中用连字符分割单词时创建两个新列

    我有一个数据集 df 其中有一列包含两个由连字符分隔的单词 我想为每个分割值创建两个新列 Value Type ABC California Low DEF New York Low 期望的输出 Value1 Value2 Type ABC
  • 如何解决错误“System.InvalidCastException - 列包含 NULL 数据”

    当我运行应用程序并搜索时出现此错误 System InvalidCastException 列包含 NULL 数据 在 Oracle ManagedDataAccess Client OracleDataReader GetDecimal
  • 如何自动重新加载我的gunicorn服务器?

    我想知道如何自动重新启动我的gunicorn 服务器 我的 django 项目代码更改后 目前 我在进行更改后正在手动重新启动 只需终止进程并重新加载即可 但这不是一个好方法 所以我想知道如何在代码更改后自动执行相同的操作 我也在使用ngi
  • 在 IntelliJ 15 中运行临时文件时出错

    Code 运行时我得到以下信息 参考 https www youtube com watch v AmeDNZ 86ig 设置 此处没有更改任何内容 找到了解决方案 请参阅此处的记录 Eugene Zhuravlev 2016 年 2 月
  • 从另一个运行空间向表单添加元素

    我有一个表单 一旦准备好 就会添加几个元素 例如 列表 添加它们可能需要一些时间 从几分之一秒到几分钟 因此 我想将处理添加到单独的线程 子线程 中 元素的数量事先未知 例如 文件夹中有多少个文件 因此它们是在子流中创建的 当子流中的处理结
  • Matplotlib 垂直拉伸 histogram2d

    我正在使用这段代码 fig plt figure num 2 figsize 8 8 dpi 80 facecolor w edgecolor k x y xy for xy in zip self pulse time distance
  • 两个单词之间的正则表达式 - 或者到行尾?

    简单的正则表达式问题 我有一个非常基本的表达式 用于在两个单词之间提取文本 BEGN DETAIL 当两个单词都存在时 效果很好 但在某些情况下 没有 DETAIL 所以在这些情况下 我只想捕获到文本的末尾 这可以用单个表达式实现吗 还是我
  • 包含美国货币的正则表达式/grep 字符串

    我有一个字符串列表 其中一些包含美元数字 例如 34232 foo n bar 有没有一个 r 只能返回包含美元金额的字符串的命令 谢谢你 Use 以保护 否则意味着 字符串结尾 grep 0 9 c 123 567 abc 57 abc
  • 错误:scalac:错误的符号引用。 SQLContext.class 中的签名引用包 org.apache.spark 中不可用的 Logging 类型

    当我使用 IntelliJ IDEA 编译 scala 文件时 显示以下错误 错误 scalac 错误的符号引用 SQLContext class 中的签名引用包 org apache spark 中不可用的 Logging 类型 当前类路
  • 如何使用 JavaScript 创建包含文件和发布数据的 AJAX 请求

    如何使用 JavaScript 创建一个 HTTP 请求来发送一个文件和一些可由 PHP 服务器接收的发布数据 我找到了以下建议 但似乎并不完整 xhr open POST upload php var boundary boundary
  • WCF 服务的 REST/SOAP 端点

    我有一个 WCF 服务 我想将其公开为 RESTful 服务和 SOAP 服务 以前有人做过类似的事情吗 您可以在两个不同的端点中公开该服务 SOAP 可以使用支持 SOAP 的绑定 例如basicHttpBinding RESTful可以
  • ArrayList 作为全局变量

    我创建了这样扩展应用程序的类 package com appnetics import java util ArrayList import android app Application public class GlobalVariab
  • 如何使用opencv copyTo()函数?

    我已通读copyTo 的文档但我仍然对如何将此函数应用于以下代码感到困惑 这个答案指出我们可以使用 copyTo 函数代替 255 x 在这种情况下如何应用这个功能 我希望有一个代码片段 Compute the gradient map o
  • 修改exe资源中的字符串

    我该如何修改buffer在下面的代码中然后保存可执行文件资源中的更改 我正在寻找类似的东西SetString handle index buffer size var hExe Cardinal buffer array 0 4097 of