如何在C#中导入Shell32.dll函数



很抱歉我的天真,这是我第一次处理DLL。我一直试图在C#应用程序上运行ShellAboutA,但完全不知道如何运行。我在谷歌上搜索了一下,发现了几个问题,并设法想出了这个代码

[DllImport("shell32.dll")]
public static extern Int32 ShellAboutA(
IntPtr? hWnd,
IntPtr? szApp,
IntPtr? szOtherStuff,
UInt64? hIcon);
ShellAboutA(null, null, null, null);

但我一运行它,它就出现错误

System.Runtime.InteropServices.MarshalDirectiveException: 'Cannot marshal 'parameter #1': Generic types cannot be marshaled.'

(我不仅不知道如何使用DLL,而且也不知道这意味着什么(

我猜这可能是因为它们都是空的。我再次检查了文档,除了szApp之外的所有东西都是可以使用的,所以我尝试了的下一个功能

string _str = "test string";
Int64 _int = Convert.ToInt64(_str, 16);
IntPtr test = new IntPtr(_int);
ShellAboutA(null, test, null, null);

int在CCD_ 1中失败无论我在这之后做了多少谷歌搜索,我都找不到解决方案。

现有代码有很多不同的问题,所以我将向您展示它应该是什么样子。

注意,ShellAboutA是函数的ASCII版本,ShellAboutW是Unicode版本。您可以让C#自动映射它,但最好指定它,而且现在您应该始终使用Unicode。

[DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
public static extern int ShellAboutW(
IntPtr hWnd,
string szApp,
string szOtherStuff,
IntPtr hIcon);

你这样称呼它

ShellAboutW(IntPtr.Zero, "hello#whats up", null, IntPtr.Zero)

如果需要,第一个参数是父窗口的Handle

最后一个参数是图标的Handle(如有必要(。要使用图标,例如可以使用GDI+加载它。

using (var icon = new Icon(filePath))
{
ShellAboutW(IntPtr.Zero, "hello#whats up", null, icon.Handle);
}

最新更新