如何知道.dll文件包含多少个图标(通过从计算机导入文件)C#
How to know how many icons a .dll file contains (by importing the file from the computer) C#
我想知道是否可以通过从用户计算机导入文件来找出一个 .dll 文件存储了多少个图标。我会详细解释我想做什么。我需要知道 .dll 文件包含多少个图标,因为我正在使用 listview 它将放置此 .dll 文件包含的图标,因为当此表单启动时,它会向用户显示图标,列表视图中要显示的图标数量是我需要显示这些图标的数量。
我想做的是用户可以从他的计算机导入他自己的.dll 文件。我的程序可以读取 .dll 文件或图标。但我必须告诉它 .dll 文件的路径,当我添加一个 .dll 文件时,我使用一个程序,而不仅仅是任何程序,它是 GConvert 5。它非常适合从 .dll 文件中以任何格式保存图标但我用它来知道我打开的这个 .dll 文件中有多少个图标。在我知道这一点之后,我为每个图标添加一行代码(从 0 开始到(.dll 文件中的图标数量))。但是,当我不在用户计算机后面时,我怎么知道一个 .dll 文件包含多少个图标呢?我这样做了:
从工具箱添加 OpenFileDialog
添加扩展名:dll 和 ico
在代码中,我补充说:
if (MyOpenFileDialog.ShowDialog() == DialogResult.Ok)
{
string dllFile = MyOpenFileDialog.FileName; // Ok, now I have the .dll file but I still can't find out how many icons this dll file contains.
//... (Some code that is necessary and will not destroy the counting of icons)
}
但我在 Google 上找不到任何解决方案,尝试了一些代码,但如果我使用 Whosebug,我的代码不起作用。
谢谢你的帮助!
我尝试使用循环在列表视图中显示图标,但它不起作用,我希望用户打开 .dll 文件,在列表视图中它只会显示其中的图标数量列表视图。
您可以使用 ExtractIconEx 函数获取图标和图标数量:
[DllImport("Shell32.dll")]
private static extern int ExtractIconEx(
string lpszFile,
int nIconIndex,
IntPtr[] phiconLarge,
IntPtr[] phiconSmall,
int nIcons);
要获取文件中图标的数量,请传递nIconIndex= -1
和nIcons = 0
,return 值将是图标的数量。稍后,使用您在上一步中收到的计数初始化所需的数组并传递 nIconIndex= 0
和 nIcons = count of icons
.
例子
这是一个非常简单的示例,展示了如何从 shell32.dll
获取图标并将它们显示在列表视图中:
[DllImport("shell32.dll")]
private static extern int ExtractIconEx(
string lpszFile,
int nIconIndex,
IntPtr[] phiconLarge,
IntPtr[] phiconSmall,
int nIcons);
[DllImport("user32.dll")]
private static extern bool DestroyIcon(IntPtr hIcon);
private void Form1_Load(object sender, EventArgs e)
{
var count = ExtractIconEx("shell32.dll",
-1, null, null, 0);
var phiconLarge = new IntPtr[count];
var phiconSmall = new IntPtr[count];
var result = ExtractIconEx("shell32.dll",
0, phiconLarge, null, count);
ImageList imagelist1 = new ImageList();
imagelist1.ImageSize = SystemInformation.IconSize;
imagelist1.Images.AddRange(
phiconLarge.Select(x => Icon.FromHandle(x).ToBitmap()).ToArray());
var listView1 = new ListView();
listView1.LargeImageList = imagelist1;
listView1.Dock = DockStyle.Fill;
listView1.View = View.LargeIcon;
listView1.Items.AddRange(
Enumerable.Range(0, count)
.Select(x => new ListViewItem(x.ToString(), x)).ToArray());
this.Controls.Add(listView1);
phiconLarge.ToList().ForEach(x => DestroyIcon(x));
}
这就是你得到的:
请注意 Jimi 根据 documentations 在评论中突出显示的要点,以在不需要时立即销毁图标句柄:当它们不再需要时需要,您必须通过调用 DestroyIcon 函数销毁 ExtractIconEx 提取的所有图标。
我想知道是否可以通过从用户计算机导入文件来找出一个 .dll 文件存储了多少个图标。我会详细解释我想做什么。我需要知道 .dll 文件包含多少个图标,因为我正在使用 listview 它将放置此 .dll 文件包含的图标,因为当此表单启动时,它会向用户显示图标,列表视图中要显示的图标数量是我需要显示这些图标的数量。
我想做的是用户可以从他的计算机导入他自己的.dll 文件。我的程序可以读取 .dll 文件或图标。但我必须告诉它 .dll 文件的路径,当我添加一个 .dll 文件时,我使用一个程序,而不仅仅是任何程序,它是 GConvert 5。它非常适合从 .dll 文件中以任何格式保存图标但我用它来知道我打开的这个 .dll 文件中有多少个图标。在我知道这一点之后,我为每个图标添加一行代码(从 0 开始到(.dll 文件中的图标数量))。但是,当我不在用户计算机后面时,我怎么知道一个 .dll 文件包含多少个图标呢?我这样做了:
从工具箱添加 OpenFileDialog
添加扩展名:dll 和 ico
在代码中,我补充说:
if (MyOpenFileDialog.ShowDialog() == DialogResult.Ok) { string dllFile = MyOpenFileDialog.FileName; // Ok, now I have the .dll file but I still can't find out how many icons this dll file contains. //... (Some code that is necessary and will not destroy the counting of icons) }
但我在 Google 上找不到任何解决方案,尝试了一些代码,但如果我使用 Whosebug,我的代码不起作用。
谢谢你的帮助!
我尝试使用循环在列表视图中显示图标,但它不起作用,我希望用户打开 .dll 文件,在列表视图中它只会显示其中的图标数量列表视图。
您可以使用 ExtractIconEx 函数获取图标和图标数量:
[DllImport("Shell32.dll")]
private static extern int ExtractIconEx(
string lpszFile,
int nIconIndex,
IntPtr[] phiconLarge,
IntPtr[] phiconSmall,
int nIcons);
要获取文件中图标的数量,请传递nIconIndex= -1
和nIcons = 0
,return 值将是图标的数量。稍后,使用您在上一步中收到的计数初始化所需的数组并传递 nIconIndex= 0
和 nIcons = count of icons
.
例子
这是一个非常简单的示例,展示了如何从 shell32.dll
获取图标并将它们显示在列表视图中:
[DllImport("shell32.dll")]
private static extern int ExtractIconEx(
string lpszFile,
int nIconIndex,
IntPtr[] phiconLarge,
IntPtr[] phiconSmall,
int nIcons);
[DllImport("user32.dll")]
private static extern bool DestroyIcon(IntPtr hIcon);
private void Form1_Load(object sender, EventArgs e)
{
var count = ExtractIconEx("shell32.dll",
-1, null, null, 0);
var phiconLarge = new IntPtr[count];
var phiconSmall = new IntPtr[count];
var result = ExtractIconEx("shell32.dll",
0, phiconLarge, null, count);
ImageList imagelist1 = new ImageList();
imagelist1.ImageSize = SystemInformation.IconSize;
imagelist1.Images.AddRange(
phiconLarge.Select(x => Icon.FromHandle(x).ToBitmap()).ToArray());
var listView1 = new ListView();
listView1.LargeImageList = imagelist1;
listView1.Dock = DockStyle.Fill;
listView1.View = View.LargeIcon;
listView1.Items.AddRange(
Enumerable.Range(0, count)
.Select(x => new ListViewItem(x.ToString(), x)).ToArray());
this.Controls.Add(listView1);
phiconLarge.ToList().ForEach(x => DestroyIcon(x));
}
这就是你得到的:
请注意 Jimi 根据 documentations 在评论中突出显示的要点,以在不需要时立即销毁图标句柄:当它们不再需要时需要,您必须通过调用 DestroyIcon 函数销毁 ExtractIconEx 提取的所有图标。