Tag: pinvoke

P / Invoke 属性是否可选用于编组数组?

假设存在一个带有纯C接口的本机函数,如下所示,从本机DLL导出: // NativeDll.cpp extern “C” void __stdcall FillArray( int fillValue, int count, int* data) { // Assume parameters are OK… // Fill the array for (int i = 0; i < count; i++) { data[i] = fillValue; } } 以下P / Invoke工作正常(使用VS2010 SP1测试): [DllImport(“NativeDll.dll”, CallingConvention=CallingConvention.StdCall)] public static extern void FillArray( int fillValue, int count, [In, […]

如何在C#中使用p / invoke将指针传递给数组?

示例C API签名: void Func(unsigned char* bytes); 在C中,当我想将指针传递给数组时,我可以这样做: unsigned char* bytes = new unsigned char[1000]; Func(bytes); // call 如何将上述API转换为P / Invoke,以便我可以将指针传递给C#字节数组?

从PInvoke返回一个字符串?

我正在使用PInvoke实现本机代码(C ++)和托管代码(C#)之间的互操作性。 我只写了一个简单的函数,它从c ++代码中获取一个字符串。 我的代码看起来像C#代码: [DllImport(“MyDll.dll”)] private static extern string GetSomeText(); public static string GetAllValidProjects() { string s = GetSomeText(); return s; } C ++代码 char* GetSomeText() { std::string stri= “Some Text Here”; char * pchr = (char *)stri.c_str(); return pchr; } 所有在c ++结束时工作正常,即pchr在“C#Here”中包含“Some Text Here”,但在C#中,字符串s包含注释。 我不知道我做错了什么。 任何帮助,将不胜感激

以编程方式移动鼠标光标

首先,我在http://swigartconsulting.blogs.com/tech_blender/2005/08/how_to_move_the.html找到了此代码: public class Win32 { [DllImport(“User32.Dll”)] public static extern long SetCursorPos(int x, int y); [DllImport(“User32.Dll”)] public static extern bool ClientToScreen(IntPtr hWnd, ref POINT point); [StructLayout(LayoutKind.Sequential)] public struct POINT { public int x; public int y; } } 将以下代码粘贴到按钮的click eventhandler中: Win32.POINT p = new Win32.POINT(); px = button1.Left + (button1.Width / 2); py = button1.Top + […]

如何在32位平台上pinvoke到GetWindowLongPtr和SetWindowLongPtr?

我想P / Invoke到GetWindowLongPtr和SetWindowLongPtr ,我看到有关它们的相互矛盾的信息。 有些消息称,在32位平台上,GetWindowLongPtr只是一个调用GetWindowLong的预处理器宏,而GetWindowLongPtr不作为user32.dll中的入口点存在。 例如: SetWindowLongPtr的pinvoke.net条目有一个静态方法,它检查IntPtr.Size,然后调用SetWindowLong或SetWindowLongPtr,注释说“遗留操作系统不支持SetWindowLongPtr”。 没有解释“遗留操作系统”的含义。 StackOverflow的答案是 “On 32bit系统GetWindowLongPtr只是一个指向GetWindowLong的C宏”。 因此,这些来源似乎表明* Ptr入口点根本不存在于32位Windows 7附带的user32.dll版本中。 但我在MSDN文档中没有看到这一点。 根据MSDN, SetWindowLongPtr取代了SetWindowLong,简单明了。 根据SetWindowLongPtr页面的要求部分,看起来SetWindowLongPtr自Windows 2000(客户端和服务器版本)以来一直在user32.dll中。 同样,没有提到32位操作系统中缺少的入口点。 我怀疑事实介于两者之间:当你告诉C ++编译器定位较旧的操作系统(即编译将在Win9x和NT4上运行的东西)时,头文件将SetWindowLongPtr声明为调用SetWindowLong的宏,但是入口点可能确实存在于Windows 2000及更高版本中,如果您告诉编译器定位这些平台,您将直接获取它(而不是宏)。 但这只是猜测; 我真的没有资源或技术可以深入挖掘并validation它。 目标平台也可能扮演一个角色 – 如果您为x86平台编译应用程序,那么就不应该在64位操作系统上调用SetWindowLongPtr。 再一次,我知道这个问题,但我不知道如何找到答案。 MSDN似乎暗示SetWindowLongPtr总是正确的。 有人能告诉我简单的P / Invoke到SetWindowLongPtr是否安全并完成它? (假设Windows 2000及更高版本。)P /调用SetWindowLongPtr会给我正确的入口点: 如果我在32位操作系统上运行针对x86平台的应用程序? 如果我在64位操作系统上运行针对x86平台的应用程序? 如果我在64位操作系统上运行针对x64平台的应用程序?

使用AllocConsole和目标体系结构x86时没有控制台输出

我有一个WinForms项目,如果用户想要一个调试控制台,我会分配一个带AllocConsole()的控制台。 所有控制台输出都正常工作,目标架构设置为“任何CPU”,但当我将其更改为“x86”时,它不会输出任何内容( Console.Read()仍然按预期工作)。 如果我直接打开EXE,则输出有效。 看起来Visual Studio将其重定向到它自己的“输出”窗口。 我也尝试了这个答案,但它没有用,我也试过Console.SetOut(GetStdHandle(-11)) ,但也Console.SetOut(GetStdHandle(-11)) 。 将目标体系结构设置为“任何CPU”对我来说是没有选择的。 所以这是我的两个问题: 为什么只有当目标体系结构设置为x86时才会出现这种情况? 在Visual Studio中运行时如何输出到我的控制台?

从.net 4 c#中取消阻止文件

是否有可能从ac#程序中取消阻止从Internet下载的文件。 浏览互联网我已经了解到,信息是在包含当前区域信息的(NTFS)文件的替代流中写入的(值3来自互联网并被解释为被阻止)。 是否有管理的可能性来清除或更改文件的区域信息(解除阻止),或者是否存在托管复制function来复制没有区域信息的文件? 如果没有,我如何处理PInvoke但不包括外部程序集(我不允许在当前项目中执行此操作)。

如何在C#中处理null或者可选的dll struct参数

如何处理使用pinvoke从C#调用的dll方法中的可选struct参数? 例如, 此处的lpSecurityAttributes参数应在缺席时传递为null 。 传递struct的正确方法似乎是使用ref ,但它不能有可选参数,或者一般取null 。 有什么方法可以达到这个目的?