程序流程:
C#按钮响应函数:
DLL.dll mdll = new dll();
bool flag = mdll.Test(false);
if (flag)
{
MessageBox.Show("true");
}
else
{
MessageBox.Show("flase");
}
C#接口:
using System.Runtime.InteropServices;
namespace DLL
{
class dll
{
[DllImport("Test.dll", EntryPoint = "test")]
private static extern bool dll_test(bool param); public bool Test(bool param)
{
bool pm = dll_test(param);
return pm;
}
}
}
MFC源码:
#pragma once
#include "stdafx.h"
#define API extern "C" _declspec(dllexport)
API bool test(bool param)
{
bool revalue = param;
return revalue;
}
步进调试时,MFC: revalue的值为false,但跑到C#接口后,pm的值为true,最后C#按钮里的flag值也为true。
不管C#里按钮的param是true还是false,返回值都是true,这个问题怎么解决啊? 百度说变量类型,参数带入的问题导致dll函数调用不成功,但我这个工程里的变量类型和参数都比较简单,只有bool变量啊,而且程序也进了dll,且执行正确。搞不明白了,兄弟们指导下啊,谢谢,拜托了!!
C#按钮响应函数:
DLL.dll mdll = new dll();
bool flag = mdll.Test(false);
if (flag)
{
MessageBox.Show("true");
}
else
{
MessageBox.Show("flase");
}
C#接口:
using System.Runtime.InteropServices;
namespace DLL
{
class dll
{
[DllImport("Test.dll", EntryPoint = "test")]
private static extern bool dll_test(bool param); public bool Test(bool param)
{
bool pm = dll_test(param);
return pm;
}
}
}
MFC源码:
#pragma once
#include "stdafx.h"
#define API extern "C" _declspec(dllexport)
API bool test(bool param)
{
bool revalue = param;
return revalue;
}
步进调试时,MFC: revalue的值为false,但跑到C#接口后,pm的值为true,最后C#按钮里的flag值也为true。
不管C#里按钮的param是true还是false,返回值都是true,这个问题怎么解决啊? 百度说变量类型,参数带入的问题导致dll函数调用不成功,但我这个工程里的变量类型和参数都比较简单,只有bool变量啊,而且程序也进了dll,且执行正确。搞不明白了,兄弟们指导下啊,谢谢,拜托了!!
解决方案 »
- 请教关于C# 读取XML文件的问题
- C#.NET(WinForm)有没有第三方的高级日历控件?有没朋友可以介绍一下。
- C#中的事件
- C#中的阻滞Socket与C++的阻滞SOCKET哪个速度更快?
- 串口通讯速度问题
- 怎样自动实现接口的方法?
- 在线等 javascript 传参
- 如何获得数据库中某个表的字段名以及对应的数据类型??
- 关于平台调用
- 求:用C#如何实现windows下运行unix服务器的c程序,并且显示程序的输出呢?
- 在datagridview自定义的列中,如何在DataGridViewTextBoxCell中加入checkbox框
- 点击主窗口上的添加,打开窗口如何保持让该窗口是焦点
API bool test(bool param)这个函数的入口处,在mfc这边F5调试运行!一步一步执行,看看到底发生了什么
改成
private static extern bool dll_test([MarshalAs(UnmanagedType.U1)]bool param);
private static extern bool dll_test([MarshalAs(UnmanagedType.U1)]bool param);
不同编译器可能会将bool定义所占内存大小不一样。
c#中缺省会认为导进来的是类似于vc中BOOL的类型,所以会是4个字节(32位机上)
而如果在vc++中返回的是bool(仅是1个字节),当然会出错!解决的两种办法:
1. VC中返回BOOL(或是直接返回int);
2. 在c#中加上关键字: MarshalAs(UnmanagedType.I1);
marshalas 不错啊。
另外,bool 不行,就改成 int 的呗。
int 总行吧。