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

来自C#的C++:C++函数(在DLL中)返回false,但C#认为它是真的!

您好!您提到的问题是关于C#和C++之间的交互,其中C++函数在DLL中返回false,但C#认为它是真的。

首先,我们需要了解一下C#和C++之间的交互是如何进行的。C#是一种面向对象的编程语言,而C++是一种支持面向对象和过程式编程的语言。在C#中,可以使用P/Invoke(Platform Invocation Services)来调用C++的DLL函数。

当C++函数在DLL中返回false时,这实际上是一个布尔值,表示函数执行失败。然而,在C#中,布尔值false通常被视为0,而非C++中的0或1。因此,如果C++函数返回false,C#可能会将其解释为真,因为非零值被视为真。

为了解决这个问题,您可以考虑以下几种方法:

  1. 更改C++函数的返回类型,使其返回一个整数,例如1表示成功,0表示失败。这样,C#就可以正确地解释返回值。
  2. 在C#中使用try-catch块来捕获异常,以便在函数调用失败时处理它们。
  3. 使用C++/CLI来创建一个托管的C++库,这样可以更好地控制C++和C#之间的交互。

总之,C#和C++之间的交互可能会导致一些问题,因此需要仔细考虑如何处理返回值和错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++静态私有字段】+【C# .cctor】+【C++ if(条件断点)】

分别为标题标注:C++静态私有字段访问,C#全局静态构造函数.cctor,以及C++ if(延伸条件断点)。这其中两个C++问题,分别对应C#分析下。...aa@AAA@@0V1@A) 然C#对于静态私有字段访问,如下即可,不需要全局设置其值。如果以C#写法应用在C++上,这是一个坑,需要注意。不得不说面向对象方面,C#爽点还是满满。...这里.cctor函数是这个模块静态默认构造函数。它运行在托管Main入口之前,运行在System.Private.Corelib.dll之后。如果你想要在托管Main函数之前做一些事情,它是首选。...C#代码里面不能够编辑它,可以通过Mono.Cecil对托管DLL添加这个函数。..."); } 这里有一个坑需要注意,比如本例对ConsoleApp5.dll程序集进行了..cctor函数添加,形成了新modified.dll托管DLL,这里需要注意,这两个托管DLL

7110

WinCE解决“图片采集及压缩”问题开发历程

虽然那个DLL驱动可以供C#调用,但是看那个驱动DLL方法,使用提取数据那个函数时候,必需要设置内核模式,而这个只能用C++来做,因为需要引用一个头文件某个函数,显然C#是没有头文件这个概念...第二阶段:用C#程序和C++DLL产生数据交互     用C++DLL可以提取到图片数据了,而且已经工控板上存储盘上保存了BMP位图文件。...这个时候,想办法用C#主程序来承接这些数据,这个时候,就直接调用DLL函数,生成文件,然后此函数返回文件路径,C#程序得到了文件路径,然后再读取文件,然后GPRS发送位图数据流。...第三阶段:在内存实现图片压缩     IImageFactory,有个函数,可以直接将jpg编码结果保存在IStream流,当时自己很高兴,有个这现成函数后来发现,数据根本就就没有保存进去...网上普遍说C++DLLC#传出字符数组char*时,C#程序对应数据类型是StringBuilder类。

1.2K20
  • VC++DLL应用(含Demo演示)

    VC++DLL应用(含Demo演示) 作者:一点一滴Beer http://beer.cnblogs.com/       大学大一时候学是C,然后后来大二时候专业又开了C++这个课程,然后再后来自己又自学了一点...这个暑假实习经历又改变了我观点:C++写窗口程序虽然麻烦,但是却什么能做,而且对比C#来说,对运行环境要求不高,不用像C#程序安装之前还要安装100M多运行.NET环境。...“dllMfcDemoDlg.h”头文件前面对来自外部dll函数进行声明 // dllMfcDemoDlg.h : header file // #if !...这个“*.exe”文件可以是任何平台C++也可以,C也可以,C#也可以,只要这个执行文件调用了dll文件函数即可。...(好像跨语言调用时候不能进行联调,笔者只C++互相调用时候联调成功过,C#调用时候没有联调成功,这个问题有待解决) 4.

    94620

    VS2005环境下DLL应用

    2.1带传入参数无返回函数     以前那篇关于DLL文章中提到过,在此不再赘述了。...比如,我曾经写一个图像数据处理函数时候,需要DLL函数返回处理完后图像数据,这个数据有150K,当时想法是声明一个150K数组,然后返回。...里面的指针对应着C#IntPtr(可以用于动态分配内存场合)     虽然里面还有,C++字符串和C#StringBuilder对应,但是这个时候涉及到C#引用DLL导出函数时候,...C#new数据类型,就相当于C++malloc一样,动态分配了内存,只是C#EXE程序不需要由程序员自己去释放,所以C#new数据,C++DLL可以直接把它看成malloc后数据...如果是C++EXE项目,调试时候,遇到DLL导出函数,然后单步执行,可以进入到本解决方案下DLL项目的源码,实现两个项目的代码联调。

    1.1K20

    C# DllImport用法

    大家实际工作学习C#时候,可能会问:为什么我们要为一些已经存在功能(比如Windows一些功能,C++已经编写好一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在功能呢...答案是肯定,大家可以通过C#DllImport直接调用这些功能。...如果未指定 SetLastError,则使用默认值 false。   4、它是一次性属性类。   5、此外,用 DllImport 属性修饰方法必须具有 extern 修饰符。...示例一:调用 Beep() API 来发出声音 Beep() 是 kernel32.lib 定义MSDN 定义,Beep具有以下原型: BOOL Beep(DWORD dwFreq,...,因此我们使用 byte 作为该 enum 基本类型 示例四:处理字符串 二 C# 调用C++代码 int 类型 [DllImport(“MyDLL.dll”)] //返回个int 类型

    95710

    VS2010上使用C#调用非托管C++生成DLL文件(图文讲解) 背景

    背景      项目过程,有时候你需要调用非C#编写DLL文件,尤其使用一些第三方通讯组件时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。...我们可以看到这里有一些文件,其中dllmain.cpp作为定义DLL应用程序入口点,它作用跟exe文件有个main或者WinMain入口函数是一样,它就是作为DLL一个入口函数,实际上它是个可选文件...现在来演示下如何利用C#项目来调用非托管C++DLL,首先创建C#控制台应用程序: ? 7....以上方法只能通过静态方法对于C++函数进行调用。那么怎样通过静态方法去调用C++中一个类对象方法呢?...注意:代码User*是个指针,返回也是一个对象指针,这样做为了防止方法作用域结束后局部变量释放。 strcpy是个复制char数组函数。 11.

    2.7K50

    C#调用C++动态库接口函数和回调函数

    前言 需求: 当前C++已经写好了一个动态库,完成了产品开发需求,C#需要调用C++编写动态库DLL接口,开发出完整软件,DLL动态库里包含了普通接口函数,回调函数。...普通接口函数调用示例 2.1 C++端编写接口 (1)头文件里声明需要提供接口,导出接口,方便C#调用 //带返回值无形参示例 EXTERN_C TOOLLIBRARY_API char* Version...回调函数不是由该函数实现方直接调用,而是特定事件或条件发生时由另外一方调用,用于对该事件或条件进行响应。...函数是你实现由别人(或系统)函数在运行时通过参数传递方式调用,这就是所谓回调函数。简单来说,就是由别人函数运行期间来回调你实现函数。...\n"); } 这是C++端编写一个回调函数设置函数C#调用这个函数函数指针传递过来,C++通过传递过来函数指针反过来主动调用C#方法,实现数据交互。

    2.6K30

    .NET 7 AOT 使用以及 .NET 与 Go 互相调用

    目录 背景 C# 部分 环境要求 创建一个控制台项目 体验 AOT 编译 C# 调用库函数 减少体积 C# 导出函数 C# 调用 C# 生成 AOT Golang 部分 安装 GCC Golang...本文主要介绍如何在 .NET 和 Go 语言中如何生成系统(Windows)动态链接库,又如何从代码引用这些库函数。...C# 导出函数 这一步可以从时总博客中学习更多:https://www.cnblogs.com/InCerry/p/CSharp-Dll-Export.html PS:时总真的太强了。...调用 C# 生成 AOT 本小节,将使用 CsharpAot 项目调用 CsharpExport 生成动态链接库。... .NET ,很多时候设计了大量重载,同一个代码有好几个变种方式,以及函数调用链太长,这样会让生成 AOT 文件变得比较臃肿。

    2.2K30

    工业党福利:使用PaddleX高效实现指针型表计读取系列文章(2)

    本节,我以压力表语义分割为例,介绍如何生成具有输入和输出接口DLL文件(本例,输入和输出均为图像)。 打开Visual studio 2019,创建一个Windows窗体应用。...C#,我们使用Bitmap类将对图像进行操作,主要为加载指定路径下图像。但是Bitmap类并不适用于C++。...所以首先需要解决问题是正确地从C#传递图像数据到C++端,然后再将c++中分割后结果传回C#。...因此需要解决问题有两个: 问题一:如何将C#图像数据传递至C++; 问题二:如何在C++接收图像数据,并将分割结果返回C++。...由于我所用图像通道数已知,就只把byte[]数据、长、宽三个数据传到LoadModel。然后通过指针方式将分割后图像返回C#

    1.5K30

    C#DllImport用法汇总

    大家实际工作学习C#时候,可能会问:为什么我们要为一些已经存在功能(比如Windows一些功能,C++已经编写好一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在功能呢...答案是肯定,大家可以通过C#DllImport直接调用这些功能。...如果未指定SetLastError,则使用默认值false。 4、它是一次性属性类。 5、用DllImport属性修饰方法必须具有extern修饰符。...具体做法如下: 首先我们服务器上随便找个地方新建一个目录,假如为C:\DLL; 然后,环境变量,给Path变量添加这个目录; 最后,把所有的非托管文件都拷贝到C:\DLL,或者更干脆DLL放到...二 C# 调用C++代码 int 类型 [DllImport(“MyDLL.dll")] public static extern int mySum (int a1,int b1); //返回

    1.9K10

    C#引用C++代码

    如果现在要求开发一个C#工程,需要用到这个DLL输出C++类CPerson,该怎么办呢?针对这个例子来说,类CPerson非常小,可以用C#重新写一个跟这个C++类一样类。...类Person所有公有成员函数都跟C++类CPerson一样,只不过成员函数参数和返回值就改成了托管C++类型,这也是让类Person能在C#中使用首要条件。...ManageCppDll { // 构造函数创建类CPerson对象并在析构函数中将该对象销毁 // 所有的成员函数实现都是通过指针m_pImp调用类CPerson相应成员函数实现...strName); m_pImp = new CPerson(wcName, cSex, iAge); } Person::~Person() { // 析构函数删除...通过这个桥梁,可以很容易重用以前用C++开发类,让这些C++类继续C#中发挥它们效用,让开发变得事半功倍。

    1.3K10

    C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用

    博客《C#开发BIMFACE系列52 CS客户端集成BIMFACE应用技术方案》中介绍了多种集成BIMFACE到客户端程序方案。...一、CefSharp 简介 CefSharp是一个围绕Chromium Embedded Framework(CEF)轻量级.NET包装器。它是C++/CLI编写。...允许开发者.NET应用程序嵌入Chromium。可以C#或VB或任何其他CLR语言中使用。CefSharp同时提供WPF和WinForms Web浏览器控件实现。...代码如下: 入口函数,获取注入 ChromiumWebBrowser 对象,名称为 _chromeBrowser。...定义一个单独类,用于CefSahrp组件加载网页之前,将其注入到网页 (4)WinForm窗体中点击【 C# 调用 JS 方法】按钮。

    2.4K40

    .Net 框架

    现在看到这些程序集引用,都是微软认为很常用,几乎是每个项目都会使用到,所以创建项目时自动添加了进来,免得开发者再手动进行添加。...从直觉来看,stringVisual Studio以深蓝色呈现,属于C#关键字,那么它应该是C#提供内置类型。...而C#并没有一个关键字去映射Console,所以我们认为Console只是普通类类型(Class Type)。...注意,元数据并不包含类型实现,有点类似于C++.h头文件。.NET,查看元数据过程就叫做反射(Reflection)。 ?...MsCorEE.dll是一个很细软件层。加载了MsCorEE.dll之后,会调用其中_CorExeMain()函数,该函数会加载合适版本CLR。CLR运行之后,程序执行权就交给了CLR。

    1.9K21

    C# 六种方式实现精确计时

    (); 从操作系统启动到现在所经过毫秒数,精度为1毫秒,经简单测试发现其实误差大约在15ms左右 缺点:返回值是uint,最大值是232次方,因此如果服务器连续开机大约49天以后,该方法取得返回值会归零...经反编译猜测它可能也是调用GetTickCount,但是它返回值是int,而GetTickCount与timeGetTime方法原型返回值是DWORD,对应C#uint,难道.NET对System.Environment.TickCount...微软对这个API解释就是每秒钟某个计数器增长数值。 如果安装硬件不支持高精度计时器,函数返回false需要配合另一个API函数QueryPerformanceFrequency。...,如果安装硬件不支持高精度计时器,函数返回false。...精度是ns C#要用该方法必须先建立一个托管C++项目(因为要内嵌汇编),编译成DLLc#调用,有点麻烦。

    1.2K30

    WinRT开发语言功能和效率

    C++ lambda传值 和作用域问题,其他C#没区别: static bool IsPrime(int n) { if (n%2 == 0) return false...1.998 1.9994 1.984 2.0003 第二种场景,将C++算法包装在DLLC++ WinRT App中使用,执行结果如下(单位毫秒): 执行次数 1(启动) 2 3 4 5 普通...9 9 9 8 9 并行 3 2 3 2 2 第三种场景,将C++算法包装在动态连接库DllC# WinRT App通过 PInvoke来调用,执行结果如下(单位毫秒): 执行次数 1(启动...(启动) 2 3 4 5 普通 8 8 8 9 9 并行 2 3 3 2 3 第五种场景,将C++算法包装在Windows Runtime Component(WRC)C# WinRT App调用...版本,也就放弃在这里展示了,如果你知道 如何在WRL实现并行计算并返回 IAsyncOperation,请不吝赐教。

    1.1K60

    C#调用C和C++函数一点区别

    最近做U800电话二次开发,需要调用厂商C函数库来打电话,后来想加入通话录音功能,发现程序默认生产WAV文件过大,又找了个WAV转MP3C++函数库程序,出了点问题。...,const char* outMP3Name); #endif 按照C#调用非托管程序约定,声明一个对应C#函数接口: [DllImport("mp3enc.dll", CharSet = CharSet.Ansi...char* szDest); //发送拨号命令 对应C#函数接口: [DllImport("UsbDll.dll", CharSet = CharSet.Ansi)] public static...于是将C#函数接口改成: [DllImport("mp3enc.dll", CharSet = CharSet.Unicode)] public static extern int mp3_enc(...正确C++ 函数C#调用接口应该是这样: [DllImport("mp3enc.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl

    1.7K60

    C#类来封装C++Dll方法

    最近帮底层开发同时用C#重新封装一下dll,也就是用C#类来封装C++Dll方法,以供用户使用。...比如http://blog.csdn.net/sunboyljp/archive/2009/12/31/5110639.aspx c++ 头文件定义: NPD_API int   NP_Init()...; C#定义函数 [DllImport("npd_api.dll")] public static extern int NP_Init(); 基本类型转换见下表(我用到过): BSTR——StringBuilder...uint,没出过什么问题) 我问题来了,长期经验教训我知道了: 1、指针做参数时C#中一定要使用ref 或out关键字,尤其是结构体指针,要不会报内存读取错误,即使不报错数据也是不太对。...最后是C++那边做了修改解决,通过制定模块定义 (.def) 文件,统一制定导出函数对应名称。返回值为结构体指针函数用IntPtr也能使用了。

    1.1K10

    c#开发客户端,如何调用c++开发sdk dll

    先写个从c#客户端调用c++ dll完成trtc初始化功能 (1) 创建一个c#客户端(选择windowsform)项目 [9505yttqad.png] (2) 程序入口main()函数,加入...(c#) -> TRTCWrapper.dll(c++) -> liteav.dll(c++,要调用目标dll) int nRet = RTCWrapper.InitWrapper(); (3)...创建RTCManager.dll(选择.netframework库)c# 项目 [r7piztft2l.png] (4) 创建RTCWrapper c#类,并用DllImport映射c++ dll接口...接着实现sdk回调通知给主程序 (1) 程序入口main()函数,加入AddTRTCMsgCallBack()准备用来注册trtc回调 Program.cs //注册SDKcallback RTCDelegate...让trtc sdk视频c#程序显示 (1) c#程序窗口中,添加个button用来测试 [g1ywbjy90x.png] Form1.cs private void button1_Click(

    5.3K50

    WPF 已知问题 包含 NaN Geometry 几何可能导致渲染层抛出 UCEERR_RENDERTHREADFAILURE 异常

    尽管可以 CombinedGeometry 进行拦截,且当前 CombinedGeometry 已经做了一定拦截措施,如果想要进行更进一步拦截本问题,则需要修改到通用逻辑。...核心原因是 CShapeBase::GetCachedBounds 对 Geometry Bounds 进行校验失败,因此导致此方法返回了 WGXERR_BADNUMBER 错误。...先看一下最开始投毒逻辑, PathGeometryWrapper.cpp 定义 GetStartPoint 方法,返回了本文使用代码里面传入包含 NaN 值,如以下代码,拿到 m_pFigure...这是为了安全,虽然我也不知道为什么将具体错误信息返回上层就不安全了 通用处理返回 WGXERR_UCE_RENDERTHREADFAILURE 错误,将会在 C# 层抛出 UCEERR_RENDERTHREADFAILURE...本文例子代码里,其实也进入了这个分支,调用堆栈如下 wpfgfx_cor3.dll!

    47310

    轻松掌握C++ AST处理方法 - CppAst.Net使用介绍

    所以曾经 G6 时候, 我们是通过 C# 来访问 libclang (使用 ClangSharp ), 当时我们就尝试自己 C#完整保存了一份来自 libclang 数据层, 当然,...这其实也是我们后面会具体说到 http://CppAst.Net一个优势, 它基本 C# 层相对完整实现了 C++这个类型系统, 这样虽然类型系统本身复杂度还是存在, 但我们 C# 层可以以比较接近原生...不然容易出现运行时找不到 libclang native dll报错. 3.1.4 添加示例代码后测试运行对应App Program.csMain()函数添加测试代码: static void...配置使用简单, 支持直接从字符串解析 C++代码 2. C#层有完整数据层 - 代码Parse后会直接将所有信息C#化并存储我们前面代码中看到 CppCompilation 3....CppCompilation上各个属性: - Namespaces - 编译单元包含命名空间 - Enums - 编译单元包含枚举 - Functions - 编译单元包含函数(一般就是全局函数

    47231
    领券