亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果有其它的簡單實現方法也可以寫出來,大家幫幫忙

如果有其它的簡單實現方法也可以寫出來,大家幫幫忙

C#
桃花長相依 2023-01-12 19:15:45
很簡單,我要實現修改EXE文件圖標的功能,須要用于如下函數。BeginUpdateResourceUpdateResourceEndUpdateResource其中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#中用什么表示呀?請大家給我寫出完整代碼(從打開到寫入完成),在此先謝過啦!
查看完整描述

2 回答

?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

建一個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());
}


查看完整回答
反對 回復 2023-01-15
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

簡單,我要實現修改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());

 


查看完整回答
反對 回復 2023-01-15
  • 2 回答
  • 0 關注
  • 171 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號