none
C++dll调用的问题 RRS feed

  • 问题

  • 我用C#调用C++写的dll,
    在C++ dll中的导出函数:
    int WINAPI test(int i,int j)
    在C#中:
    [DllImport("test.dll")]
    public extern static int test(int i);
    我是这样导入的。
    比C++中函数少了一个参数,这样运行的时候为什么没有错误?
    而我用C++调用这个dll会报告错误
    tingsking C# boy
    2009年5月25日 2:25

答案

  • 那是因为在C++里你已经把它声明成int WINAPI test(int i,int j)了,已经告诉编译器有两个参数了,你调用的时候只填了一个参数肯定会出错。

    若是你本来就声明成int WINAPI test(int i),这样C++照样不会报错。

    你在C#里声明的参数只有一个,这和你在C++中的声明根本就不一样么,有什么可比性?
    public extern static int test(int i);


    baadfood?cafebabe?
    2009年6月10日 13:51
    版主
  • To tingsking
    我在VC8中试过,Loadlibrary读取dll,获得test后调用,确实如Vonger 所说,是不会报错的,在dll中print a,b的值是乱码。
    在你的程序中VC会报错,能否将错误提示贴上来,大家一起分析一下,你在dll loader中的声明是 int __stdcall test(int i);
    那么在dll中是否对test也声明的是__stdcall呢?如果不是即使在loader中声明int __stdcall test(int ,int );也是会报错的。
    2009年7月10日 6:09

全部回复

  • 而我用C++调用这个dll会报告错误,是什么意思?
    2009年5月25日 7:02
  • DLL并不会检查参数!你在动态调用时就算一个参数都不传也是可以调用的,但是未传递参数会变成未设置的乱值,这样你的程序就会出错了。

    你可以试验下,写一个DLL,里面就一个函数void test(int a, int b){},然后以void test(void)来调用,也不会出错的。但是调试时会发现a和b都是乱值。
    Hello world
    2009年5月25日 15:39
    版主
  • 你说的这个意思我明白。

    我用VC 调用int WINAPI test(int i,int j)

    是这样调用的   test(12);

    这样,VC会报告错误。


    而如果我用C#
    [DllImport("test.dll")]
    public extern static int test(int i);
     

    test(12);这样调用的话,C#根本不提示我错误。

    我的问题是,为什么VC会报错,而C#不会。
    tingsking C# boy
    2009年6月2日 2:21
  • [DllImport("xxx.dll")]
    是用来导入C++函数的

    请问在C#中如何 导入 C++ dll中的类 阿 ?


    少悲切,勿徘徊。。。
    2009年6月2日 8:25
  • 那是因为在C++里你已经把它声明成int WINAPI test(int i,int j)了,已经告诉编译器有两个参数了,你调用的时候只填了一个参数肯定会出错。

    若是你本来就声明成int WINAPI test(int i),这样C++照样不会报错。

    你在C#里声明的参数只有一个,这和你在C++中的声明根本就不一样么,有什么可比性?
    public extern static int test(int i);


    baadfood?cafebabe?
    2009年6月10日 13:51
    版主
  • 你咋不动手试试捏?
    tingsking C# boy
    2009年6月25日 0:11
  • 你好,
            能看一下dll的.def文件中对这个函数是怎么描述的吗?
    麻烦把正确答案设为解答。
    2009年6月25日 0:38
    版主
  • ; dll.def : Declares the module parameters for the DLL.

    LIBRARY      "dll"
    DESCRIPTION  'dll Windows Dynamic Link Library'

    EXPORTS
        ; Explicit exports can go here
     test


    tingsking C# boy
    2009年6月25日 8:36
  • 是因为在C++里你已经把它声明成int WINAPI test(int i,int j)了,已经告诉编译器有两个参数了,你调用的时候只填了一个参数肯定会出错。

    若是你本来就声明成int WINAPI test(int i),这样C++照样不会报错。

    你在C#里声明的参数只有一个,这和你在C++中的声明根本就不一样么,有什么可比性?
    public extern static int test(int i);


    baadfood?cafebabe?

    int WINAPI test(int i),
    我在C++里就是这样声明的,两边不一样我还比个什么劲?


    这样调用时会报错的。
    tingsking C# boy
    2009年6月25日 8:40
  • To tingsking
    我在VC8中试过,Loadlibrary读取dll,获得test后调用,确实如Vonger 所说,是不会报错的,在dll中print a,b的值是乱码。
    在你的程序中VC会报错,能否将错误提示贴上来,大家一起分析一下,你在dll loader中的声明是 int __stdcall test(int i);
    那么在dll中是否对test也声明的是__stdcall呢?如果不是即使在loader中声明int __stdcall test(int ,int );也是会报错的。
    2009年7月10日 6:09