首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2019-3-7-手把手教你PInvoke

所以我们一步步来看如何将c++MessageBox转化为我们C#签名 手把手PInvoke 首先打开Programming reference for Windows API -Microsoft...第一个是一个HWND类型,表示一个窗口句柄, 可以通过HWND=Handle to A Window来记忆 那么在c#我们可以使用Intptr类型,表示一个指针或者句柄 ?...接着是签名和参数,LPGUID我们没有提过,看解释这边是指向GUID一个指针,所以我们使用Guid这个类型 ?...,里面聚集了各种pinvoke写法,如果不清楚怎么使用,可以去其中查看 另外vs也带有pinvoke插件,使用方法可以参见吕毅同学博客使用 PInvoke.net Visual Studio Extension...,以避免陈旧错误知识误导,同时有更好阅读体验。

83130
您找到你想要的搜索结果了吗?
是的
没有找到

VS2017生成DLL(C语言)文件并在C#中使用

第六步:在c文件输入一个简单函数这里使用了_declspec(dllexport),但_declspec(dllexport)并不是必须,后面一种方法将不使用_declspec(dllexport...第八步:在头文件输入函数声明 ? 这里也可以改成下面这样,extern "C" 如果是c语言调用并不需要,加这个是因为c++调用的话,指定c++调用方式和c语言一样. 加这个就是做兼容....因为使用_declspec(dllexport),虽然这里我们只编译了一次,却生成了dll和lib两个文件 接下来在C# 中使用:首先将上面生成dll放到C#目录下,一般是\bin\x86\Debug...WindowsFormsApp12.Form1::sum”调用导致堆栈不对称。原因可能是托管 PInvoke 签名与非托管目标签名匹配。...请检查 PInvoke 签名调用约定和参数与非托管目标签名是否匹配。”

2.1K10

使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名

因为 C# 不能引入 C++ 中常用头文件,于是各种方法签名、结构体定义等等都需要各种寻找。然而 PInvoke.net 帮助我们解决了这个问题。...---- PInvoke.net PInvoke.net 官方网站是 https://www.pinvoke.net/,如果你只是希望临时找一找 P/Invoke 函数调用方法签名,那么直接去网站就能搜索...使用 PInvoke.net 扩展 在安装了 PInvoke.net 插件后,可以在顶部菜单栏寻找到 PInvoke.net 菜单项,里面可以插入 PInvoke 函数调用签名: ?...随后点击 Insert 便在代码得到了一份 MoveWindow P/Invoke 函数签名。...不过 https://www.pinvoke.net/ 是包含。 ? 除了包含 C# 调用所需函数签名之外,还包含函数签名中所用结构体或枚举类型定义。

1.1K10

Win32C# 应用使用 GDI+ 对窗口截图(BitBlt)

在 Windows 上有 GDI+ 来操作位图,不止能完成很多位图操作,还提供了与 Win32 窗口互操作,可以截到 Win32 窗口图片。 如果你希望对窗口截图,那么可使用本文提供方法。...依赖,或者没有依赖 在本文代码,你可以考虑引用以下这些库来简化代码。...如果你不熟悉 P/Invoke 写法,你可以参考 使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名 - walterlv。...var hBitmap = Gdi32.CreateCompatibleBitmap(wdc, width, height); // 关联兼容位图和兼容内存,这么做,下面的像素位块(bit_block...更多截窗口方法 (本文)Win32/C# 应用使用 GDI+ 对窗口截图(BitBlt) - walterlv Win32/C# 应用不依赖任何库使用纯 GDI+ 对窗口截图(BitBlt) - walterlv

49830

C# 8.0 可空引用类型各项警告错误含义和示例代码

C# 8.0 引入了可为空引用类型和不可为空引用类型。当你需要给你或者团队更严格要求时,可能需要定义这部分警告和错误级别。...本文将介绍 C# 可空引用类型部分警告和错误提示,便于进行个人项目或者团队项目的配置。...C# 8.0 如何在项目中开启可空引用类型支持 - 吕毅 C# 可空引用类型 NullableReferenceTypes 更强制约束:将警告改为错误 WarningsAsErrors - 吕毅 警告和错误...GetText() { return null; } CS8609 返回类型引用类型为 Null 性与重写成员匹配。...> FooAsync() { } CS8610 参数引用类型为 Null 性与重写成员匹配。 比如你基类中方法参数值不允许为 null,但是实现中方法参数却允许为 null。

46120

HTTPS调试签名证书错误ERR_CERT_COMMON_NAME_INVALID解决方法

1、问题现象 使用自签名证书后,chrome报错此服务器无法证实它就是 www.webrtc.cn 它安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您连接。...错误码是NET::ERR_CERT_COMMON_NAME_INVALID: 如下图所示: 2、问题原因 生成证书时候没有加上备用名称字段,目前浏览器校验证书都需要这个字段。...3、解决方法 生成证书时候需要添加上备用名称(subjectAltName)扩展字段。...= *.dyxmq.cn DNS.2 = *.maqian.xin DNS.3 = *.maqian.io DNS.4 = *.maqian.co DNS.5 = *.maqian.cn 在DNS.x地方填写上自己域名...,如果多个域名,可以按照规律DNS.1/DNS.2/DNS.3/...来添加,同时还支持IP地址形式,填入IP.1 = x.x.x.x就可以了。

3.8K30

Win32C# 应用不依赖任何库使用纯 GDI+ 对窗口截图(BitBlt)

在 Windows 上有 GDI+ 来操作位图,不止能完成很多位图操作,还提供了与 Win32 窗口互操作,可以截到 Win32 窗口图片。 如果你希望对窗口截图,那么可使用本文提供方法。...如果打算自己写 P/Invoke 又不熟的话,你可以参考 使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名 - walterlv。...Win32 互操作需要用到数据结构,所以本文代码只会列出库暂时没有的(不然代码太多了)。...var hBitmap = Gdi32.CreateCompatibleBitmap(wdc, width, height); // 关联兼容位图和兼容内存,这么做,下面的像素位块(bit_block...更多截窗口方法 Win32/C# 应用使用 GDI+ 对窗口截图(BitBlt) - walterlv (本文)Win32/C# 应用不依赖任何库使用纯 GDI+ 对窗口截图(BitBlt) - walterlv

48920

模拟隐蔽操作 - 动态调用(避免 PInvoke 和 API 挂钩)

此外,此 API 让您可以轻松地在 C# 从内存调用非托管代码(传递参数并接收输出),而无需执行一些像自注入 shellcode 这样变通方法。 我们通过Delegates魔力实现了这一点。....这让 Delegate 在调用函数时知道如何设置 CPU 寄存器和堆栈。如果将此与通常在 C# 从内存调用非托管代码方式(通过自注入 shellcode)进行比较,这会容易得多!...包装器通过确保正确传递参数并返回正确类型对象来帮助用户。 值得注意是:PInvoke 比 DInvoke 对数据类型更宽容。...如果您在 PInvoke 函数原型中指定数据类型不完全正确,它会默默地为您更正它们。对于 DINvoke,情况并非如此。...如果您知道如何解决此问题,请告诉我们:-D 否则,我们将在有时间时修复它。) 将函数添加到模块 重载内存模块并将结果映射到不同进程。

2K00

使用 C# dynamic 关键字调用类型方法时可能遇到各种问题

你可以使用 dynamic 来定义一个变量或者字段,随后你可以像弱类型语言一样调用这个实例各种方法,就像你一开始就知道这个类型所有属性和方法一样。..."); object GetSomeInstance() { return 诡异东西; } 我们 GetSomeInstance 明明返回是 object,我们却可以调用真实类方法...接下来讲述使用 dynamic 过程可能会遇到问题和解决方法。 编译错误:缺少编译器要求成员 你初次在你项目中引入 dynamic 关键字后,会出现编译错误,提示 “缺少编译器要求成员”。...{0} 是类型名称,而 {1} 是使用 dynamic 访问属性或者方法名称。...”未包含“Key”定义” 出现此异常原因是: dynamic 所引用对象里面,没有签名相同 public 属性或者方法 于是,如果你确认你类型里面是有这个属性或者方法的话,那么就需要注意需要将此成员改成

49330

推荐官方开源 PInvoke 库 包含大量 win32 封装

在调用 win32 库时候,小伙伴会遇到问题是不知道对应 win32 函数应该如何写。或者在网上抄了代码实现都有些诡异,想要自己封装发现工作量太大。...第一个就是减少从网上复制粘贴有趣 PInvoke 调用实现,其次是质量上能保底。虽然官方实现也不够完美,例如 User32 GetWindowLong 方法依然有坑。...但是因为此项目是在 github 开源 因此也会有大量小伙伴入坑不断修复,相对来说应该会比自己实现好一些 现在官方已经将大量 dll 进行了封装 已经实现 dll 如下 Library Package...在 dotnet 里面使用库都是统一使用 NuGet 方法,在 NuGet 里面按照自己需要安装对应库就可以了 如我想要调用 Kernel32 CreateProcess 方法,这个方法里面包含了很多结构体等实现...-%E5%BA%93-%E5%8C%85%E5%90%AB%E5%A4%A7%E9%87%8F-win32-%E5%B0%81%E8%A3%85.html ,以避免陈旧错误知识误导,同时有更好阅读体验

1.2K20

Mono 把 .NET 应用程序移植到 Linux

C# 和 .NET 目标是把您从底层编程问题中解脱出来,如类型安全问题、内存管理、库构造等,以便把精力集中到构建应用程序和业务逻辑上。从而可以帮助缩短开发周期。...随着 C# 和 .NET 战略喧嚣尘上,有人可能在想 Linux 社区将作出什么样反应。本文讨论开放源码世界(在 Novell 强力支持下)如何通过实现自己编译器和类库来欢迎这种语言。...(从 C# 程序通过 Platform Invocation Facility [pinvoke] 使用 C 库代码就是一个例子,稍后还将提到。) 如前所述,您代码获得了平台独立性。...虽然 .NET 框架可使用很多种语言,但是 C# 最为 .NET 开发人员所看重。C# 是一种高效、带有无用单元回收语言,提供了强大面向对象能力,可以让您迅速进入编程任务核心。...这里采用一种快速而简陋方法创建该文件(虽然没有任何格式化),从终端提示符运行下列命令(都在一行): $ echo 'class X { static void Main () { System.Console.Write

3.8K80

50个常见 Java 错误及避免方法(第一部分)

“Invalid Method Declaration; Return Type Required” 此Java软件错误消息表示方法签名未明确声明方法返回类型。 ?...有若干途径会触发“Invalid Method Declaration; Return Type Required” 错误: 忘记声明类型 如果方法没有返回值,那么需要将“void”声明为方法签名类型...它解阐明了方法签名正在调用错误参数。 ? 调用方法期待方法声明定义某些参数。检查方法声明并仔细调用,以确保它们是兼容。...查看此讨论,里面说明了Java软件错误消息如何识别在方法声明和方法调用由参数创建兼容性。(@StackOverflow) 9....编译器抛出“Missing Return Statement”消息原因有若干: 返回语句由于错误被省略。 该方法没有返回任何值,但类型void在方法签名未声明。

2K30

如何在控制台程序监听 Windows 前台窗口变化

本文会介绍两类知识,一类是如何在 .NET/C# 程序中方便地调用 Win32 API,另一类是在控制台程序开启 Windows 消息循环。...虽然我第一时间想到了延时轮询方式,并且好久以前也确实是这么写。但其实有更好方法来解决这个问题,而且 Lsj Window Debugger 也正计划实现这个功能,对此也有更多了解。...microsoft/CsWin32,因为我只会用到少数几个 Win32 函数,希望引入庞大 P/Invoke 相关库。....NET/C# 程序如何在控制台/终端以字符表格形式输出数据 - walterlv 开源项目 本文代码已经开源在 GitHub 上,感兴趣可以去项目中阅读更新代码: https://github.com...本文会经常更新,请阅读原文: https://blog.walterlv.com/post/monitor-foreground-window-on-windows ,以避免陈旧错误知识误导,同时有更好阅读体验

65820
领券