Tag: pinvoke

对PInvoke函数的调用使堆栈失衡。 这可能是因为托管的PInvoke ..(.NET 4)

我的项目在.NET Frame 3.5中成功运行且没有错误。 但是,当我将它定位到.NET Frame工作4.我收到错误: “ 对PInvoke函数的调用使堆栈失衡。这可能是因为托管的PInvoke签名与非托管目标签名不匹配。 ” 我使用了非托管库,如下所示: [StructLayout(LayoutKind.Sequential )] public class DGNElemCore { public int offset; public int size; public int element_id; public int stype; public int level; public int type; public int complex; public int deleted; public int graphic_group; public int properties; public int color; public int weight; public int style; public […]

C# – 将unsafe byte *转换为byte

我有一个unsafe byte*指向已知长度的本机字节数组。 如何将其转换为byte[] ? 指向零终止本机字符串的unsafe sbyte*可以很容易地转换为C# string ,因为有一个转换构造函数用于此目的,但我找不到将byte*转换为byte[]的简单方法。

使用c#删除外部应用程序的标题栏

我的应用程序启动了另一个外部应用 我想在启动后删除此外部应用程序的标题栏。 这是可行的,如果是这样的话怎么办? 根据评论,我使用下面的工作代码 //Finds a window by class name [DllImport(“USER32.DLL”)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); //Sets a window to be a child window of another window [DllImport(“USER32.DLL”)] public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); //Sets window attributes [DllImport(“USER32.DLL”)] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); //Gets window […]

在C#/ .NET中访问MAX_PATH之外的文件

背景 我需要编写一个使用.NET 2.0版本的工具(由于政治,商业和机密性/信任原因,使用现成的东西不是这个客户的选项)通过网络将文件从一个服务器迁移到另一个服务器。 服务器是本地团队的文件服务器,需要将某些团队文件夹迁移到其他服务器以便于重组。 基本的想法是我们读取每个文件并在数小时内通过网络流式传输,几天后数据将被迁移。 需要保留文件权限。 由于这需要几天时间(我们正在谈论几千兆字节的数据,对于某些团队而言),我们需要每晚迭代文件并比较修改日期并更新已更改的日期。 理论上,最终新服务器将拥有最新的文件副本,用户可以切换到新服务器。 它当然不是那么简单,但我们有一个我们认为应该工作的设计:) 问题 所以从理论上讲,我们只需打开文件,通过网络流式传输,然后在另一端写入,对吧? 🙂 不幸的是,在服务器本身,文件共享是在文件夹路径创建的,例如: D:\ Data \ Team Shares \ DIVISION \ DEPARTMENT \ NAME OF TEAM – 可能会长篇大论 对于每个用户,此路径映射到驱动器,例如,它将作为\\ SERVER \ TEAMNAME共享并映射到T:驱动器。 这导致了从T:驱动器可见的文件在MAX_PATH限制范围内的情况,但是当在服务器本身上本地查看时,它们会超出它。 我们无法使用网络共享来访问文件,因为这个工具需要是通用的,要在数百个这样的服务器上运行,并且没有标准的方法来判断哪些文件共享是我们应该移动的文件共享,哪些不是 – 有甚至没有命名约定标准。 此外,偶尔会有其他股份的子股,因此我们超过MAX_PATH限制两倍! 我知道使用“\\?\”前缀指定路径的解决方法,该路径将路径视为UNC路径,并允许理论上最多32k个字符。 这种解决方法是在Win32 API级别实现的,System.IO命名空间(大部分)基本上只是本机Win32 API函数的一个薄包装,但是在将调用交给API之前,Microsoft已经“帮助”实现了额外(不正确)的validation。 。 在这种情况下,.NET Framework拒绝该路径,因为它声称’?’ 是一个无效的路径字符。 所以我的问题是……有没有一种方法我没有想到这将允许我解决这个问题,而不必完全重写几乎整个System.IO命名空间,加载P / Invoke调用,只是为了删除这个烦人的validation?

C#调用C函数返回具有固定大小char数组的struct

所以,这个问题有很多变种,看了好几个后我仍然无法弄明白。 这是C代码: typedef struct { unsigned long Identifier; char Name[128]; } Frame; Frame GetFrame(int index); 这是C#代码: struct Frame { public ulong Identifier; [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 128)] public char[] Name; } [DllImport(“XNETDB.dll”, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern Frame GetFrame(int index); 这是我在C#中尝试过的最后一次尝试,看起来非常符合逻辑,但我收到错误“方法的签名与PInvoke不兼容”。 所以,我有点迷失下一步的尝试。 任何帮助表示赞赏。 谢谢,凯文 Kevin 更新 了这个作为我的答案的编辑 我应该改为我的C代码: void […]

这个PInvoke代码是否正确可靠?

在这个问题中,我搜索了一个解锁文件的简单解决方案。 感谢所有的评论和回答,我找到了PInvoking DeleteFile的简单解决方案。 它工作,但因为我从来没有通过PInvoke(Win32)使用文件操作,我不知道是否有一些陷阱或是否有另一种方法调用DeleteFile来删除文件的备用流。 我还不知道的是,我是否必须在try / catch中包装调用,或者仅仅查看布尔结果就足够了。 在我的测试中,没有提出exception,但我不知道在现实世界中会发生什么。 public class FileUnblocker { [DllImport(“kernel32”, CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool DeleteFile(string name ); public bool Unblock(string fileName) { return DeleteFile(fileName+ “:Zone.Identifier”); } } 这段代码看起来可靠吗? 更新 我发布了一个不完整的方法(unblock方法没有将“Zone.Identifier”文字连接到文件名)。 我现在纠正了这个,抱歉。

如何编组指向结构指针数组的指针?

我有一个带有以下签名的C函数: int my_function(int n, struct player **players) players是一个指向struct player对象指针数组的指针。 n是数组中指针的数量。 该函数不修改数组也不修改结构的内容,并且在返回后不保留任何指针。 我尝试了以下方法: [DllImport(“mylibary.dll”)] static extern int my_function(int n, [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] player_in []players); 但是,它将数据编组为指向结构数组的指针,而不是指向结构指针数组的指针。

使用进程间同步对象同步2个进程 – Mutex或AutoResetEvent

请考虑以下情形:我正在运行我的应用程序,在执行期间,必须运行另一个进程,并且只有在第二个进程完成内部特定初始化之后,我的第一个进程才能继续。 例如: … // Process1 code does various initializations here Process.Start(“Process2.exe”); // Wait until Process2 finishes its initialization and only then continue (Process2 doesn’t exit) … 我看到几个选项: Mutex – 在考虑进程间通信时会自动想到Mutex,但是,我看不到让Process1等待他自己生成的互斥锁的方法。 我可以使Process2创建一个互斥锁并等待Process1直到创建Mutex(使用轮询和Mutex.OpenExisting函数) AutoResetEvent – 那些对于任务来说是完美的,但是,似乎在.NET下这些不能用于进程间通信。 CreateEvent – 我可以使用P / Invoke并使用Win32 CreateEvent函数。 从理论上讲,它可以为我提供我需要的一切。 但是,如果可能的话,我宁愿不使用本机函数。 使用外部文件 – 最简单的方法就是使用一些操作系统外部对象(文件,注册表等)。 然而,这似乎相当hacky。 我很高兴听到你对这个案子的意见。 谢谢!

在WPF窗口中挂钩进入Windows消息循环,在内部添加白色边框

我试图创建一个WPF窗口,其中WindowStyle=”None” (对于自定义按钮,没有标题)无法resize。 将ResizeMode设置为NoResize将删除我想要保留的aero边框。 我可以设置最小/最大尺寸属性并完成它,除了: resize的游标仍然可见,并且 显示窗口以响应用户操作并适合其内容。 它显示图像,因此大小会发生变化。 所以,我有一个简单的方案,让我99%的方式: public class BorderedWindowNoResize : Window { [DllImport( “DwmApi.dll” )] public static extern int DwmExtendFrameIntoClientArea( IntPtr hwnd, ref MARGINS pMarInset ); [DllImport( “user32.dll”, CharSet = CharSet.Auto )] public static extern IntPtr DefWindowProc( IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam ); public BorderedWindowNoResize() { Loaded += BorderedWindowNoResize_Loaded; } […]

获取活动窗口文本(并向其发送更多文本)

我在C#中创建一个小实用程序,当按下全局热键时,它会向活动文本框添加一些文本,这是一种自动完成function。 我有我的全局热键,但现在我不知道如何在活动文本框中获取当前文本(如果活动窗口是一个文本框)。到目前为止我尝试过的是使用 一个。 GetForegroundWindow然后使用该句柄调用GetWindowText。 这给了我活动窗口的窗口标题,而不是文本框内容。 湾 GetActiveWindow并使用该句柄调用GetWindowText。 这根本不给我任何文字。 这是我所做的一个例子 [DllImport(“user32.dll”)] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); [ DllImport(“user32.dll”) ] static extern int GetForegroundWindow(); [ DllImport(“user32.dll”) ] static extern int GetWindowText(int hWnd, StringBuilder text, int count); [DllImport(“user32.dll”)] static extern int GetActiveWindow(); public static void TestA() { int h = GetForegroundWindow(); StringBuilder b = new […]