Tag: pinvoke

DllImport和char *

我有一个我想从DLL导入的方法,它有一个签名: BOOL GetDriveLetter(OUT char* DriveLetter) 我试过了 [DllImport(“mydll.dll”)] public static extern bool GetDriveLetter(byte[] DriveLetter); 和 [DllImport(“mydll.dll”)] public static extern bool GetDriveLetter(StringBuilder DriveLetter); 但是没有在DriveLetter变量中返回任何内容。

如何将结构编组为指向结构的指针?

我试图将一个结构从C#传递到C ++库。 我将结构作为对象传递,C ++函数将它作为指针(void *)。 我有问题通过结构。 [DllImport(“MockVadavLib.dll”, CharSet = CharSet.Ansi)] public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec); 这是我得到的运行时exception文本: “无法封送’参数#1’:无效的托管/非托管类型组合(此值类型必须与Struct配对)。” 虽然我发现了一篇在这种情况下使用LPStruct的MSDN文章。 这是我试图编组的结构: [StructLayout(LayoutKind.Sequential)] public struct UserRec { [MarshalAs(UnmanagedType.I4)] public int userParam1; } 这是C ++函数: MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {…

NativeMethods类是否在.NET中专门处理?

https://msdn.microsoft.com/en-us/library/ms182161.aspx 此页面上描述的三个类是否在.NET Framework中专门处理? (NativeMethods,SafeNativeMethods和UnsafeNativeMethods) 我问的原因是我想知道是否可以创建NativeMethods类的类别。 例如: ComNativeMethods User32NativeMethods OleStorageNativeMethods

如何使用.net 更改Windows2k8的时区设置

我已经尝试用c#代码改变我的系统的时区几天了,而我正在尝试的任何东西都没有多大意义或工作。 我开始尝试使用我在其他问题上看到的SetTimeZoneInformation的PInvoke语法。 [DllImport(“kernel32.dll”, CharSet = CharSet.Auto)] private static extern bool SetTimeZoneInformation([In] ref TimeZoneInformation lpTimeZoneInformation); 我正在研究如何创建TimeZoneInformation结构并因为我的系统显然具有动态DST系统而感到困惑。 事实certificate,自从微软Vista添加了一种处理时区的新方法以来。 您现在必须使用SetDynamicTimeZoneInformation [DllImport(“kernel32.dll”, CharSet = CharSet.Auto)] private static extern bool SetDynamicTimeZoneInformation([In] ref DynamicTimeZoneInformation lpTimeZoneInformation); 我在msdn上搜索了这个API的帮助,发现了一些问题,“应用程序必须具有SE_TIME_ZONE_NAME特权才能使此function成功。” 最终我发现这个页面看起来像是一个很好的代码来完成这个。 问题是它不起作用。 这是我的非工作代码: [StructLayout(LayoutKind.Sequential)] public struct LUID { public int LowPart; public int HighPart; } [StructLayout(LayoutKind.Sequential)] public struct TOKEN_PRIVILEGES { public LUID Luid; public UInt32 […]

C#从任务栏隐藏应用程序

我一直在努力从应用程序中隐藏任务栏中的另一个应用程序。 我一直在使用SetWindowLong函数来设置/删除扩展样式上的WS_EX_APPWINDOW。 我已尝试单独设置和删除属性以及获取当前WindowLong,并将其删除/添加到该窗口,如下所示: SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & WS_EX_APPWINDOW); 并尝试删除它: SetWindowLong(pMainWindow, GWL_EXSTYLE, GetWindowLong(pMainWindow) & ~WS_EX_APPWINDOW); 在没有首先获得窗口的情况下也尝试了这两种方法。 这是我的整个代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } [DllImport(“User32.dll”)] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); [DllImport(“User32.dll”)] public static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport(“user32.dll”)] static extern bool ShowWindow(IntPtr hWnd, int […]

使用IOCTL_DVD_ *控制代码从C#调用DeviceIoControl

我试图从C#调用DeviceIoControl用于IOCTL_DVD_*控制代码。 阅读了大量信息并尝试了一些例子后,我没有取得多大进展。 我最终要做的是获取DVD_LAYER_DESCRIPTOR结构,了解当前DVD驱动器中的媒体。 我可以在DVD设备上成功调用CreateFile ,但是当我尝试使用控制代码IOCTL_DVD_START_SESSION调用DeviceIoControl ,它返回成功代码,但我似乎没有成功恢复sessionId值,总是返回0.(并且任何尝试我然后尝试使用IOCTL_DVD_READ_STRUCTURE获取图层描述失败,即函数失败或返回成功但是给出一个空白的输出结构。) 在找到一些进行类似调用的C代码后,我能够编译这段代码(使用Visual C ++ 2008 Express Edition),并且它成功地能够启动会话,读取DVD_LAYER_DESCRIPTOR ,并且没有问题地关闭会话,所以我知道这有效。 C#问题似乎与如何定义外部函数和编组参数有关。 以及如何定义传递和返回的各种结构。 我已经查看了www.pinvoke.net他们如何定义它,并使用了一些给出的示例代码和定义,但仍然具有上述相同的问题。 部分问题似乎是每个IOCTL控制代码的参数都不同,主要是结构,但对于IOCTL_DVD_START_SESSION ,输出值是32位整数。 如何定义C#中的extern方法来处理这些不同的情况? 另外,使用正确大小的成员类型定义的各种结构显示它们在C和C#代码之间的大小不同,但各个成员的大小相同??? 如果我使用像DeviceIOView这样的程序并观察IOCTL_DVD_START_SESSION的C代码和C#代码IOCTL_DVD_START_SESSION则C版本返回一个3的sessionid,并且当运行C#代码时,DeviceIOView显示发回的数据也是3所以似乎是返回参数的某种编组问题,因为我们在C#代码中只看到0 有没有人有任何想法或工作示例代码如何从C#调用DeviceIoControl来访问DVD信息? (显示应如何定义和使用结构和function。)非常感谢任何指向有用网站或其他建议的链接。 (在Visual C#2008 Express Edition,.NET 3.5中开发。) N Johns 示例代码(已添加) using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices; using System.IO; using System.Threading; namespace Example { class Program { static void […]

64位窗口上的P / Invoke是否需要与32位不同的签名?

当我创建一个引用user32.dll的签名时,如果目标是64位计算机,我应该用user64.dll构建它吗? [DllImport(“user32.dll”, CharSet = CharSet.Auto)] public static extern bool ChangeClipboardChain( IntPtr hWndRemove, IntPtr hWndNewNext); 目前这不是问题,因为我的目标只是32位,因为来自供应商(Progress OpenEdge)的库只提供32位库来访问他们的数据库。 我目前没有64位Windows计算机,看看是否是这种情况。

调用SendMessage(P / Invoke)会一直崩溃

我不得不写一个与第三方程序通信的应用程序( 美国在线 ,对不起。:() 做了大量的研究我发现了一些使用P / Invoke做到这一点的方法,并且在大多数情况下它可以正常工作,但它会在随后的试验中崩溃,特别是使用SendMessage 。 我正在概述下面的崩溃代码。 所有这些都是从旧的,旧的Visual Basic文件移植到.NET 。 这是古老的,我知道如果它不可行 – 我只是希望有一种比Visual Basic 4.0更好的方法来完成这项工作。 [DllImport(“kernel32.dll”, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CloseHandle(IntPtr hObject); [DllImport(“user32.dll”, SetLastError = true)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport(“user32.dll”, SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string […]

如何在Win32 C ++项目中使用C#dll?

我正在研究一个解决方案,它的大部分核心引擎都是作为Win32 C ++开发的(并且与平台无关,也用于OS X),前段时间我们需要从C#调用C ++ dll的核心引擎,我能够在C#中加载主解决方案的DLL(在SO的某些线程的帮助下)。 但是现在我们在Managed C#dll中实现了某些东西,需要在Win32 C ++项目中使用它吗? (只提供函数定义和DLL)

编组包含字符串的结构

我基本上想要从c#中的用户获取int name和string age并将其发送到用c编写的dll方法,其中包含int和char [50]参数并返回字符串.i创建以下场景但我失败了,任何正文都有代码 我有一个用c开发的dll,它有一个结构 struct Argument { int age; char name[50]; } ; 和方法 extern “C” { __declspec(dllexport) Argument FillData(Argument data) { Argument mydata; mydata.age=data.age; for(int i=0;i<=sizeof(data);i++) { mydata.name[i]=data.name[i]; } return mydata; } 我在Cs_dll.cs中的c#中声明它 [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] public struct Argument { public int age; [MarshalAs(UnmanagedType.TBStr)] //public char name; public char[] name; }; public class Cs_Dll { […]