您的位置:程序门 -> vc/mfc -> 进程/线程/dll



一个简单的dll问题,问题究竟在哪里啊?以前没碰到过


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


一个简单的dll问题,问题究竟在哪里啊?以前没碰到过[已结贴,结贴人:kkk16]
发表于:2008-01-16 13:29:23 楼主
我有个简单的dll,内容如下:
//mydll.h
extern   "c"   _declspec(dllexport)   int   _stdcall   add(int   a,   int   b);

//mydll.cpp
int   _stdcall   add(int   a,   int   b)
{
return   a+b;
}

我调用dll的程序如下:
hinstance   h   =   ::loadlibrary("mydll.dll");

typedef   int   (*pfunc)(int,   int);
pfunc   myfunc;
myfunc   =   (pfunc)::getprocaddress(h,"add");
myfunc(1,2);


结果getprocaddress函数总是返回空,只有把mydll中的_stdcall关键字去掉就正确了。

那请问,我dll中的_stdcall关键字不去掉,怎么样在我的程序中用getprocaddress调用这个dll呢?

发表于:2008-01-16 13:35:081楼 得分:5
1.用.def文件确定导出函数名。
2.查看dll的实际的导出函数名,然后在getprocaddress中使用对应的函数字符串。
发表于:2008-01-16 13:39:282楼 得分:15
使用vc自带的工具.depends   或叫dependency   walker.一般在程序=> vs6.0=> vs6.0tool下有快捷方式.没有可以去下载.   通过这个工具打开dll,可以看你导出的函数正确的名称.使用_stdcall   你也可以自己定义   def文件来保证输出函数名的不变性.如.
exports
        add   @8
发表于:2008-01-16 13:40:203楼 得分:5
哦.有人抢沙发.   他说的是两种实现方式   .我说的正是这两种方式的实现方法.
发表于:2008-01-16 13:44:264楼 得分:0
c/c++ code
hinstance h = ::loadlibrary("mydll.dll"); typedef int (_stdcall *pfunc)(int, int); pfunc myfunc; myfunc = (pfunc)::getprocaddress(h,"add"); myfunc(1,2);
发表于:2008-01-16 13:48:085楼 得分:50
建议你实习函数调用方式的知识..   _stdcall代表了函数的一种调用约定,不同的调用约定会使add函数的导出函数名不同..不加的话,函数名还是add,   而加了的话,   函数名有可能是类似_add@8之类的函数名..   所以会在你调用的时候找不到add的函数地址(因为它此时的名字已不再是add)  
首先请看下面的宏定义:  
#define       callback               __stdcall                       //       用于回调函数  
#define       winapi                   __stdcall                       //       用于api函数  
#define       winapiv                 __cdecl  
#define       apientry               winapi                          
#define       apiprivate           __stdcall  
#define       pascal                   __stdcall  

如果通过vc++编写的dll欲被其他语言编写的程序调用,应将函数的调用约定声明为__stdcall方式,winapi、callback都采用这种方式,而c/c++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用c编译方式(在c++中需将函数声明为extern       "c"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number       ,而__cdecl调用约定却不会  

参考:http://blog.chinaunix.net/u/18517/showart_309975.html
发表于:2008-01-16 13:59:186楼 得分:25
(pfunc)::getprocaddress(h,"_add@8");  


快速检索

最新资讯
热门点击