高分求助:c#中如何调用updateresource这个api函数!

author author     2023-04-11     439

关键词:

很简单,我要实现修改EXE文件图标的功能,须要用于如下函数。
BeginUpdateResource
UpdateResource
EndUpdateResource

其中UpdateResource我不会用。函数原型如下。
-----------------------------
函数功能:该函数增加,删除,或替代某可执行文件中的资源。

函数原型:BOOL UPdateResource(HANDLE hUpdate,LPCTSTR lPTyPe,LPCTSTR IPName,WORD wLanguage,LPVOID lgData,DWORD cbData);

参数:

hUpdate:指定更新文件句柄。此句柄由BeginUpdateResource函数返回。

lpType:指向说明将被更新的资源类型的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKENTRESOURCE传递的整数值,含义参见EnumResLangProc\lpType。

lpName:指向说明待被更新的资源名称的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKEINTRESOURCE传递的整数值。

wLanguage:指定将被更新资源的语言标识。要了解基本的语言标识符以及由这些标识符组成的字语言标识符的列表,可参见宏MAKELANGID。

lpData:指向被插入可执行文件的资源数据的指针。如果资源是预定义类型值之一,那么数据必须是有效且适当排列的。注意这是存储在可执行文件中原始的一进制数据,而不是由Loadlcon,LoadString或其他装载特殊资源函数提供的数据。所有包含字符串、文本的数据必须是Unicode格式;IpData不能指向ANSI数据。

如果lpData为NULL,所指定的资源将从可执行文件中被删除。

cbData:指定lpData中的资源数据数据大小,以字节计数。

返回值:如果函数运行成功,返回值为非零;如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。

注意:应用程序重复使用UpdateResource去改变资源数据。每次UpdateResource调用都要占用系统内部的一个增加、删除、替代的列表,而实际上并没有将数据写到可执行文件中。应用程序必须通过使用EndUpdateResource函数将每次积累的变化写入可执行文件中。
------------------------------
这是C的函数原型,在C#中用什么表示呀?
请大家给我写出完整代码(从打开到写入完成),在此先谢过啦!

如果有其它的简单实现方法也可以写出来。
看清题目(用C#实现),如果谁能做出来,多少分我都给,反正我不想用百度知道了!

函数原型:BOOL UpdateResource(HANDLE hUpdate,LPCTSTR lPTyPe,LPCTSTR IPName,WORD wLanguage,LPVOID lgData,DWORD cbData);

参数:

hUpdate:指定更新文件句柄。此句柄由BeginUpdateResource函数返回。

lpType:指向说明将被更新的资源类型的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKENTRESOURCE传递的整数值,含义参见EnumResLangProc\lpType。

lpName:指向说明待被更新的资源名称的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKEINTRESOURCE传递的整数值。

wLanguage:指定将被更新资源的语言标识。要了解基本的语言标识符以及由这些标识符组成的字语言标识符的列表,可参见宏MAKELANGID。

lpData:指向被插入可执行文件的资源数据的指针。如果资源是预定义类型值之一,那么数据必须是有效且适当排列的。注意这是存储在可执行文件中原始的一进制数据,而不是由Loadlcon,LoadString或其他装载特殊资源函数提供的数据。所有包含字符串、文本的数据必须是Unicode格式;IpData不能指向ANSI数据。

如果lpData为NULL,所指定的资源将从可执行文件中被删除。

cbData:指定lpData中的资源数据数据大小,以字节计数。

返回值:如果函数运行成功,返回值为非零;如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。

注意:应用程序重复使用UpdateResource去改变资源数据。每次UpdateResource调用都要占用系统内部的一个增加、删除、替代的列表,而实际上并没有将数据写到可执行文件中。应用程序必须通过使用EndUpdateResource函数将每次积累的变化写入可执行文件中。
参考技术A 建一个Win32函数的工具类如下:
public static class Win32Api

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr BeginUpdateResource(string pFileName, [MarshalAs(UnmanagedType.Bool)]bool bDeleteExistingResources);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, ushort wLanguage, IntPtr lpData, uint cbData);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);


然后像C#方法一样调用就行了。
比如:(示意代码,未验证)

string fileName = @"XXX\XXX.xxx";
// 获得资源句柄
IntPtr hResource = Win32Api.BeginUpdateResource(fileName, false);
if (hResource.ToInt32() == 0)
throw new Win32Exception(Marshal.GetLastWin32Error());

string fileToUpdate = @"YYY\YYY.yyy";
// 累积更新
if (Win32Api.UpdateResource(hResource, "FILE", fileToUpdate, 0, null, 0) == false)
throw new Win32Exception(Marshal.GetLastWin32Error());


// 写入更新
if (Win32Api.EndUpdateResource(hResource, false) == false)
throw new Win32Exception(Marshal.GetLastWin32Error());
本回答被提问者采纳
参考技术B 简单,我要实现修改EXE文件图标的功能,须要用于如下函数。
BeginUpdateResource
UpdateResource
EndUpdateResource

其中UpdateResource我不会用。函数原型如下。
-----------------------------
函数功能:该函数增加,删除,或替代某可执行文件中的资源。

函数原型:BOOL UPdateResource(HANDLE hUpdate,LPCTSTR lPTyPe,LPCTSTR IPName,WORD wLanguage,LPVOID lgData,DWORD cbData);

参数:

hUpdate:指定更新文件句柄。此句柄由BeginUpdateResource函数返回。

lpType:指向说明将被更新的资源类型的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKENTRESOURCE传递的整数值,含义参见EnumResLangProc\lpType。

lpName:指向说明待被更新的资源名称的字符串,它以NULL为终止符。这个参数可以是一个通过宏MAKEINTRESOURCE传递的整数值。

wLanguage:指定将被更新资源的语言标识。要了解基本的语言标识符以及由这些标识符组成的字语言标识符的列表,可参见宏MAKELANGID。

lpData:指向被插入可执行文件的资源数据的指针。如果资源是预定义类型值之一,那么数据必须是有效且适当排列的。注意这是存储在可执行文件中原始的一进制数据,而不是由Loadlcon,LoadString或其他装载特殊资源函数提供的数据。所有包含字符串、文本的数据必须是Unicode格式;IpData不能指向ANSI数据。

如果lpData为NULL,所指定的资源将从可执行文件中被删除。

cbData:指定lpData中的资源数据数据大小,以字节计数。

返回值:如果函数运行成功,返回值为非零;如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。

注意:应用程序重复使用UpdateResource去改变资源数据。每次UpdateResource调用都要占用系统内部的一个增加、删除、替代的列表,而实际上并没有将数据写到可执行文件中。应用程序必须通过使用EndUpdateResource函数将每次积累的变化写入可执行文件中。
------------------------------
这是C的函数原型,在C#中用什么表示呀?
请大家给我写出完整代码(从打开到写入完成),在此先谢过啦!

如果有其它的简单实现方法也可以写出来。
问题补充:看清题目(用C#实现),如果谁能做出来,多少分我都给,反正我不想用百度知道了!

建一个Win32函数的工具类如下:
public static class Win32Api

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr BeginUpdateResource(string pFileName, [MarshalAs(UnmanagedType.Bool)]bool bDeleteExistingResources);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, ushort wLanguage, IntPtr lpData, uint cbData);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);


然后像C#方法一样调用就行了。
比如:(示意代码,未验证)

string fileName = @"XXX\XXX.xxx";
// 获得资源句柄
IntPtr hResource = Win32Api.BeginUpdateResource(fileName, false);
if (hResource.ToInt32() == 0)
throw new Win32Exception(Marshal.GetLastWin32Error());

string fileToUpdate = @"YYY\YYY.yyy";
// 累积更新
if (Win32Api.UpdateResource(hResource, "FILE", fileToUpdate, 0, null, 0) == false)
throw new Win32Exception(Marshal.GetLastWin32Error());


// 写入更新
if (Win32Api.EndUpdateResource(hResource, false) == false)
throw new Win32Exception(Marshal.GetLastWin32Error());
参考技术C 找了个例子
function TFormMain.ReplaceMediaRes(SrcFileName:String;MediaFileName:String):Boolean;
var
fs:TFileStream;
buffer:PChar;
hUpdateRes:THandle;
begin
result:=false;
if not FileExists(SrcFileName) then begin
MessageBox(Handle,pchar(SrcFileName+' not exists.'),pchar(Application.Title),MB_ICONERROR);
exit;
end;
if not (FileExists(MediaFileName)) then begin
MessageBox(Handle,pchar(MediaFileName+' not exists.'),pchar(Application.Title),MB_ICONERROR);
exit;
end;
fs:=TFileStream.Create(MediaFileName,fmOpenReadWrite);
try
GetMem(buffer,fs.size);
try
fs.ReadBuffer(buffer^,fs.size);
//begin update resource
hUpdateRes:=BeginUpdateResource(pchar(SrcFileName),false);
if(hUpdateRes=0) then begin
MessageBox(Handle,pchar('Error to begin update resource.'),pchar(Application.Title),MB_ICONERROR);
exit;
end;
//!! the language id can get with GetUserDefaultLangID(), in english system it's 1033.
result:=UpdateResource(hUpdateRes,pchar('PLAYER'),pchar('MEDIA'),1033,buffer,fs.Size);
if not result then begin
MessageBox(Handle,pchar('Error ro update resource'),pchar(Application.Title),MB_ICONERROR);
exit;
end;
if not EndUpdateResource(hUpdateRes,false) then begin
MessageBox(Handle,pchar('Error to end update resource.'),pchar(Application.Title),MB_ICONERROR);
exit;
end;
finally
FreeMem(buffer);
end;
finally
fs.Free;
end;
result:=true;
end;
参考技术D 分太少,加到500分的话可以考虑。

[高分求助]如何批量打印html文件~高分求助

...开打印,但是文件数量过大,寻求批量打印方法,谢谢,高分求助参考技术A1.c盘是否是NTFS格式,如果是,其格式将不被DOS识别,所以误格个别的盘。用NTFSforDOS就可以了。2.用EasyRecovery试一下。3.可以安装一键恢复精灵。4.等数据... 查看详情

求助c#写的webform如何在客户端调用客户端.16条

webForm不能调用客户端!!只能使用OCX控件调用!!参考技术A  你自己写一个C#Activex去调他C++的DLL就可以了呀,你就把Activex当成C/S的Windows窗体,这样就能实现你的要求了。   查看详情

急急急!!!高分求助,c语言(c#,asp.net)写1至7随机4位数字组合,顺序不限,满意加分,

C++语言实现版本,和C语言是通用的,用的也是C的库,用C++的输入输出流更方便点,你用C的话把输入输出改改就行了!看了所有的问题,这应该是你想要的,贴上代码!#include<iostream>#include<stdlib.h>#include<time.h>using ... 查看详情

高分求助onenote达人

onenote共享之后其他人编辑了总会出现XXX’scopy分区,非常烦人,如何让他不出现?共享群组里有10版也有07版用sharepoint和groove共享的谢谢了参考技术A路过 查看详情

在 C# 中创建一个高分列表

】在C#中创建一个高分列表【英文标题】:Creatingahighscorelistinc#【发布时间】:2021-11-3009:34:08【问题描述】:我需要使用数组/列表来完成我的作业,并考虑在我的Windows形式游戏的高分列表中使用一个。现在我正在为我的Score使用... 查看详情

高分诚心求助!数据库设计如何实现不同用户进行不同操作的权限管理?!(数据库sql2000+编程语言c#)

具体问题:学生信息管理系统。有三类用户,学院教务处可以管理所有学生的数据,系教务处可以管理本系学生的数据。每个学生只可以管理自己的数据。数据库需要几个表,具体字段及实现不同用户进行不同操作的权限管理方... 查看详情

c#中如何调用copy和粘贴函数

...粘贴到另外一个记事本,谁能告诉我啊?谢谢了!C#菜鸟求助!能不能给的详细点啊?我是个菜鸟啊!!Clipboard.Clear();Clipboard.SetText("111111111");textBox1.Paste();参考资料:回答即可得两分,帮人就是帮自己!参考技术AClipboard.Clear();Clipboa... 查看详情

高分求助生成二维码的vb代码

我要做个二维码高速公路收费系统,求助达人们怎么编写生成二维码的vb代码~!!是vb语言哦。不好意思,我所有分数只有5分了,倾囊而出~!知道的好心人帮帮我哦。用PDF417动态库可生成2维条码阅读直接用2维条码扫描枪即可读... 查看详情

高分求助:如何让html静态页面的源代码被,js代码屏蔽

有些网站,打开网页查看源代码,出现的源代码是一串JAVA代码并不是网站的源代码,这样起到了让人看不到源代码的效果,请问高手,需要怎么样才能达到这样的效果。提示:绝对不是网页批量加密,也不是网页批量转换成js代... 查看详情

psp2000会用ctf主题的进来!高分求助!

咱是2000的5.00M33系统想用个CTF主题!不知该如何装!我就要这个主题!会用的帮帮我!http://bbs.duowan.com/viewthread.php?tid=14392029&extra=&page=1PSP玩家网或者PSP电玩巴士有教你如何使用CIF主题首先你要去下载CIF主题插件下好后解压到记忆... 查看详情

高分求助:用wpa_supplicant获取wifi热点信息时,如何区分wep加密方式是共享密钥的还是开放系统的?

本次提问不是一般的手工WiFi连接,是用程序调用这个工具,通过程序解析获取到的数据来判断网络连接里的每一个信号会有一个小锁子(应该在左下角),锁扣打开为开放式,锁扣闭合为加密模式。追问感谢回复,不过你的回... 查看详情

c#求助!sqlserver数据库中的字段的datetime值赋值给datetimepicker如何实现?

privatevoidbtn_edit_Click(objectsender,EventArgse)if(dataGridView1.SelectedRows.Count==0)MessageBox.Show("请选择需要修改的会员");return;elsetext_Name.Text=dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[2].Value.ToString().Replace("","");combo_sex... 查看详情

c#如何读取html格式的excel表格绑定到datatable中?求助大神!

strConn="Provider=Microsoft.Ace.OleDb.12.0;"+"DataSource="+FullName+";";ExtendedProperties=ExtendedProperties+"Excel12.0Xml;";使用上述代码报错:外部表不是预期的格式。一种解决方法是用System.IO.File.ReadAllLines(FullName,Encoding.UTF8... 查看详情

高分求助:oracle大表更新,大约200万,insert和update太慢,如何解决?

最近工作需要,几乎天天要更新一张表有A表200万条数据,另一个临时表B有5000到500000条数据,需要从B表中一条一条去A表中核实,要是存在的话,更新A中的一些数据,没有的话就插入;A表没有分区,建有索引,A表正在使用;现... 查看详情

debugassertionfailed!是啥问题?高分求助

就是这个问题帮忙解决了再加100直观地说,就是store.cpp的第519行出错了。但并不一定是说,519行有什么语法错误,也可能根源在此之前。该警告表明程序在选定点的行为与预期行为不符合。在程序跟踪调试过程出现此警告,最常... 查看详情

如何在 C# 中获取调用方法 [重复]

】如何在C#中获取调用方法[重复]【英文标题】:HowIcangetthecallingmethodsinC#[duplicate]【发布时间】:2010-09-2812:49:03【问题描述】:可能重复:HowcanIfindthemethodthatcalledthecurrentmethod?我需要一种方法来知道C#中调用方法的名称。例如:priv... 查看详情

高分求助破解md5码!~~急!~~~~~~~~~~~

32位的,不小心忘记管理员密码,用网上的解密软件都解不开!用普通的32位md5码替换也不行!求助高手解密!2551d37e6a5127f16a4a89671cd7b2ab是正版网站的源码,两年前买的,是那种安装版,重做了系统安装好后密码还原成以前的了,... 查看详情

如何在 C# 中调用 .exe 文件 [重复]

】如何在C#中调用.exe文件[重复]【英文标题】:Howtocalla.exefileinC#[duplicate]【发布时间】:2017-01-0517:37:10【问题描述】:我的要求是我需要通过C#程序调用一个.exe文件谁能帮我看看如何在C#编程中使用语法调用.exe文件?提前致谢【... 查看详情