首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 请教有关DLL中带参数函数的调用问题。 [已结贴,结贴人:DeatHWilL]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DeatHWilL
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-20 17:28:25 楼主
    各位好!我现在编写了一个DLL,内容如下:

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>

    __declspec (dllexport) int __stdcall Add (void)
    {
        int x;
       
        x = 100;
       
        return x;
    };
    编译完成,没有问题。

    调用这个DLL的程序是这么写的:

    #include "windows.h"
    #include "stdio.h"

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int iCmdShow)
    {
        HINSTANCE hAdd;
        FARPROC Add;

        if(hAdd= LoadLibrary ("Add.dll"))
            {
                Add = GetProcAddress (hAdd, "Add");
                printf ("%i\n", Add(100)); 
                FreeLibrary (hAdd);
            }
       
    }

    编译的时候会提示"too many arguments to function"。我想请问一下,是我DLL编的时候的问题,还是我调用的问题,导致我无法填入参数。如何修改?谢谢!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DeatHWilL
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:30:271楼 得分:0
    不好意思,我编辑帖子的时候没有注意,Dll部分应该是这样:
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>

    __declspec (dllexport) int __stdcall Add (int n)
    {
        int x;
       
        x = 100 + n;
       
        return x;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CXBID
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:31:272楼 得分:0
    当然是DLL本身有问题
    __declspec (dllexport) int __stdcall Add (int n)
    {
        int x;
       
        x = 100;
       
        return x;
    };
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • coverallwangp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:31:473楼 得分:0
    调用的问题。你定义的Add是没有参数的(void)
    而你调用的加了个100
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DeatHWilL
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:35:014楼 得分:0
    谢谢2、3楼的及时回复,我刚刚没来得及修改,请指点一下我修改后的程序吧。谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DeatHWilL
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:03:155楼 得分:0
    自己顶一下,希望能有人帮我解答一下,谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbh2001
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:33:306楼 得分:0
    请检查一下调用约定
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jillnicky
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:37:187楼 得分:0
    up起来学习!~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ChamPagneZ
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 11:53:298楼 得分:0
    C/C++ code
    //FARPROC typedef int (*FARPROC)(void)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nowplaycn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 12:07:579楼 得分:10
    前面的Add()无参数,后面调用的Add()有参数。
    调用方法有误,不是Add();,而是(*Add)(100);

    -----------------------------------------------------------
    《征服C/C++企业软件开发核心技术》
    主题词 unix/linux 多线程 网络通讯 数据库 内存排错和性能分析
    http://www.khp.com.cn/books/detail.asp?bookid=1707
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lovelyday
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 14:08:0510楼 得分:0
    dll的动态调用~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DeatHWilL
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 15:18:2411楼 得分:0
    各位好!我把程序修改了一下:
    #include "windows.h"
    #include "stdio.h"

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int iCmdShow)
    {
        HINSTANCE hAdd;
        typedef int (__stdcall*FARPROC) (int);//这个地方可以这么写么?
        FARPROC Add;

        if(hAdd= LoadLibrary ("Add.dll"))
            {
                Add = GetProcAddress (hAdd, "Add");
                printf ("%i\n", Add(100)); 
                FreeLibrary (hAdd);
            }
       
    }

    出的错误提示变成了:invalid conversion from `int (*)()' to `int  (*)(int)',这个......怎么解决一下呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ChamPagneZ
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 16:53:4212楼 得分:0
    C/C++ code
    typedef int (*FARPROC)(void); //FARPROC是个系统定义的类型,它是函数指针类型 ,无参数,返回为int. //你不能用这个类型
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DeatHWilL
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:42:5313楼 得分:0
    To chamPagneZ:
      我理解您的意思是说,如果我的函数带有参数的话,就不能使用FARPROC来......指向我需要调用的函数。那您能告诉我应该用什么方式来调用我的带参数的函数呢?谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ChamPagneZ
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 17:58:3914楼 得分:10
    C/C++ code
    int (*Add)(int );
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DeatHWilL
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 11:35:3315楼 得分:0
    谢谢各位的答复!我的问题被糊里糊涂的暂时搞好了。-.-!
    程序基本上没有变化,只不过我原来的调用Dll程序是C++的方式编译,后来我改成了C的方式编译(不知道这么描述对不对),就不再报错了。用int (*Add)(int ) 和 FARPROC到都没有什么区别......

    我把程序重新编辑一下,再写下来让大家看一看:

    DLL:
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>

    __declspec (dllexport) int Add (int n)
    {
     
        int x;
        x = 100 + n;
        return x; comp.lang.c这个新闻组里的哪位大哥我也不知道,直接把我这小段程序否了,说直接return 100 + n就OK啦!用个x根本就没有用,一大串英文解释我也没太看明白......
    }

    Call DLL:
    #include "windows.h"
    #include "stdio.h"

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int iCmdShow)
    {
        HINSTANCE hAdd;
        //int (*Add)(int);
        FARPROC Add;
        if(hAdd= LoadLibrary ("Add.dll"))
            {
                Add = GetProcAddress (hAdd, "Add");这里出过的问题是invalid conversion from `int (*)()' to `int  (*)(int)',就算改成 int (*Add)(int)也还会出问题,估计是我太笨了,不会用-.-!。         
                printf ("%i\n", Add(400));这里出过的问题是too many arguments to function,当出现上面那个问题后,就不再出现这个问题了......             
                FreeLibrary (hAdd);
            }
    }
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved