代码是:
[DLLImport("Generator.dll",EntryPoint="ResetMachine")]
[return:MarshalAs(UnmanagedType.I1)]
public static extern bool ResetMachine();使用的时候直接用一个 if 判断,if里面判断以后执行的程序,不对ResetMachine()进行操作,只是些C#的认证之类的
if(ResetMachine())
{
  //true执行的程序
}else
{
  //false执行的程序
}他写的是回调函数,在返回以前用弹出框返回了值,是true,但是到我这边调用判断的时候就成false了求高手帮忙解决下、、、 、、、

解决方案 »

  1.   

    确认dll内的ResetMachine函数判断真假的条件。
      

  2.   

    dll是实现和一个设备的连接,连接成功后dll会给设备发个命令,如果设备接受命令成功返回true,失败返回false,我写的是C#部分,dll是用C++开发,我写的部分只是要判断true和false然后对应用层做相应的提示操作
      

  3.   

    不,在测试的时候,他在返回以前用弹出框返回了值,是true,可是到我这边调用判断的时候就成false了,说明底层连接设备成功了
      

  4.   


    你让他不要在返回前用弹出框,而是在最后直接返回true。这样可以排除他dll 的问题。
      

  5.   

    直接返回true,是没有问题的,可以返回true,但是一改回来就又是false了,他看他的代码又说他那儿没有问题,所以我现在很纠结啊,找不到问题到底出在哪儿
      

  6.   

    1、C++dll里放几个AfxMessageBox,跟踪返回情况,排除dll在返回前已经是false;
    2、第二种可能是C++dll里用的不是false和true,可能是0或非0来表示真假;
    3、看你上面贴出的代码,如果在调用ResetMachine函数前没有其他操作应该是没问题的(可以尝试将“[return:MarshalAs(UnmanagedType.I1)]”去除试试)。
      

  7.   

    1.可以试试;
    2.我可以确定是false和true,源码我看过一些;
    3.我上面贴的代码用的就是[return:MarshalAs(UnmanagedType.I1)]
    还有没有一些其他的方法来测啊,我刚入软件行业不深,还请多多指教下、、、 、、、
    非常感谢
      

  8.   


    那你这个C#函数声明依据是什么啊?
    总有个dll,对吧,用VC的DEPENDS.EXE工具打开,看看这个函数的原型!贴出来,,,
      

  9.   

    他给你的DLL总有个说明吧,函数原型说明DLL。他原始的数据类型,跟你声明的是否一致?如果不行的话,你声明一个非托管对象,用那个对象获得函数的返回值,然后再把这个非托管对象的值赋值到一个托管对象中,然后再进行判断。一般返回对象是结构体的,都是需要这样做的,不能直接声明一个结构体,把函数返回值直接赋值给这个结构体
      

  10.   

    DLL返回的确实有可能不是bool型的
    而是0和1
    试试看吧
      

  11.   

    换成这样:[DLLImport("Generator.dll",EntryPoint="ResetMachine")]
    [return:MarshalAs(UnmanagedType.Bool)]//4 字节布尔值(true != 0、false = 0)。这是 Win32 BOOL 类型。 
    public static extern bool ResetMachine();