如何从c#中调用shextracticonw ?
本文关键字:调用 shextracticonw | 更新日期: 2023-09-27 18:08:49
如何在c#中使用shextracticonw dll函数,我设法在AutoIt中做到这一点,
Local $arResult = DllCall('shell32.dll', 'int', 'SHExtractIconsW', _
'wstr', $sIcon, _
'int', $aDetails[5], _
'int', $iSize, _
'int', $iSize, _
'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)
这是一个来自微软网站的参考,http://msdn.microsoft.com/en-us/library/windows/desktop/bb762163(v=vs.85).aspx
基本上我想从exe文件中提取图标,但这里几乎所有的例子都不能做到这一点,在autoit中我可以用shextracticonw来做到这一点,所以我想在c#中尝试一下。
注意:我想要64x64到256x256的图标大小,而不是低于。
这似乎是一个文档记录很差的函数。
phIcon
的文档说:
当该函数返回时,包含一个指向图标句柄数组的指针。
但是由于参数的类型是HICON*
,调用者必须提供数组。
pIconId
的文档也是错误的。结果它也是一个数组。
所有的封送都可以使用默认设置完成。由于这个API没有ANSI版本,所以给它全称SHExtractIconsW
,并将Charset
设置为Unicode。
到目前为止,文档中没有提到SetLastError
被调用。
[DllImport("Shell32.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
static extern uint SHExtractIconsW(
string pszFileName,
int nIconIndex,
int cxIcon,
int cyIcon,
IntPtr[] phIcon,
uint[] pIconId,
uint nIcons,
uint flags
);
要调用它,你需要像这样分配数组:
IntPtr[] Icons = new IntPtr[nIcons];
uint[] IconIDs = new uint[nIcons];
最后,我赞同@Cody的评论。由于这个API的文档显然是不正确的,我将尝试使用一个文档正确的替代API,并且您可以在将来依赖它。
既然你似乎在努力让这一切的工作,这里有一个有趣的程序,提取和显示图标从shell32.dll
。我没有尝试做任何错误检查,没有在图标上调用DestroyIcon
等等。
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication12
{
public partial class Form1 : Form
{
[DllImport("Shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern uint SHExtractIconsW(
string pszFileName,
int nIconIndex,
int cxIcon,
int cyIcon,
IntPtr[] phIcon,
uint[] pIconId,
uint nIcons,
uint flags
);
public Form1()
{
InitializeComponent();
}
private IntPtr[] Icons;
private int currentIcon = 0;
uint iconsExtracted;
private void Form1_Load(object sender, EventArgs e)
{
uint nIcons = 1000;
Icons = new IntPtr[nIcons];
uint[] IconIDs = new uint[nIcons];
iconsExtracted = SHExtractIconsW(
@"C:'Windows'System32'shell32.dll",
0,
256, 256,
Icons,
IconIDs,
nIcons,
0
);
if (iconsExtracted == 0)
;//handle error
Text = string.Format("Icon count: {0:d}", iconsExtracted);
}
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Image = Bitmap.FromHicon(Icons[currentIcon]);
currentIcon = (currentIcon + 1) % (int)iconsExtracted;
}
}
}