用LoadLibrary和GetProcAddress函数调用dll的代码有问题
来源:互联网 发布:家庭ktv点歌软件 编辑:程序博客网 时间:2024/05/21 09:00
用LoadLibrary和GetProcAddress函数调用dll的代码有问题,希望高手指点(谢谢)!
请高手指点程序有何问题,我做了一个dll文件想用显示的方式调用,就是用LoadLibrary和GetProcAddress函数实现,可是运行总是出错。
程序代码如下:
//Dll_Test.cpp 生成Dll_Test.dll
#include "stdafx.h"
#include "Dll_Test.h"
int Max(int a, int b)
{
if(a>b)
return a;
else
return b;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//Test_GetMax.cpp
#include "stdafx.h"
#include <stdio.h>
#include <afxwin.h>
#include <afxext.h>
#include <afxdisp.h>
#include <afxdtctl.h>
int main(int argc, char* argv[])
{
typedef int (CALLBACK* LPFNDLLFUNC)(int ,int);
HINSTANCE hDLL;
LPFNDLLFUNC lpfnDllFunc;
hDLL = LoadLibrary("Dll_Test.dll");
if (hDLL != NULL)
{
lpfnDllFunc = (LPFNDLLFUNC)GetProcAddress(hDLL, "Max");
if (!lpfnDllFunc)
{
FreeLibrary(hDLL);
}
else
{
printf("已经找到函数");
int a;
a = lpfnDllFunc(1,2);
printf("返回直:%d",a);
}
}
return 0;
}
问题点数:100、回复次数:12Top
1 楼louifox(兰陵笑笑生)回复于 2005-04-02 14:41:24 得分 5
注意Dll_Test.dll在哪个文件夹下。Top
2 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-02 15:01:31 得分 2
保证dll在工程目录下
出错指什么错误?Top
3 楼legendhui(秋天的叶子)回复于 2005-04-02 15:27:24 得分 2
看看你的dll路径是否正确Top
4 楼wenxinfly(文心)回复于 2005-04-02 15:36:54 得分 2
上面说得有道理
不过还有你的int Max()函数是不是加上标识为导出函数的标识Top
5 楼laiyiling(陌生人[MVP])回复于 2005-04-02 20:31:20 得分 50
不要callback试试
typedef int(SQRTPROC)(int ,int);
SQRTPROC* lpfnDllFunc;
lpfnDllFunc = (SQRTPROC* )GetProcAddress(hDLL, "Max");Top
6 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2005-04-02 20:36:15 得分 10
楼主最好用.def文件导出
避免编译器更改你的导出函数的名字。
另外,如果你的函数本身没有加调用约定,那么你用typedef定义函数指针的时候,也不要加。Top
7 楼wellin()回复于 2005-04-02 23:55:01 得分 20
typedef int(*AAA)(int ,int);
AAA lpfnDllFunc;
HINSTANCE hInst;
hInst = LoadLibrary("DemoDll.dll");
lpfnDllFunc = (AAA)GetProcAddress(hInst, 函数名);
lpfnDllFunc(a,b);
Top
8 楼tankbattle(坦克大战)回复于 2005-04-03 00:44:50 得分 3
用dumpbin.exe(vc里有)看看动态库导出的函数名被改成了什么。Top
9 楼redkit(ChinaYan)回复于 2005-04-03 12:49:00 得分 2
hDLL = LoadLibrary("Dll_Test.dll");
这句话你还是使用绝对路径吧!
Top
10 楼sambios(雨雪逝去)回复于 2005-04-03 15:41:04 得分 4
你以上的代码有以下几个不妥的地方:
1)没有说明要导出什么函数。
2)缺少.def文件。
以下是更正的文件内容:
dll中的函数改为以下代码:
extern "C" __declspec(dllexport) int __stdcall Max(int a, int b)
{
if(a>b)
return a;
else
return b;
}
//以下是test.def文件内容:
EXPORTS
Max
//:~
主函数不用修改。这样就没有问题了。
Top
11 楼wangzi163(甲骨文)回复于 2005-04-03 19:20:23 得分 0
其实我已经声明了,可是忘了写了,如下:
extern "C"_declspec(dllimport) int Max(int a,int b);
最后原因把callback去掉就好使了,谢谢各位!Top
12 楼robot1980(往事如风)回复于 2005-06-06 14:47:36 得分 0
Ok
- 用LoadLibrary和GetProcAddress函数调用dll的代码有问题
- 动态调用DLL. LoadLibrary和GetProcAddress
- 通过LoadLibrary() 与 GetProcAddress()获得Dll内的函数
- dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!
- GetProcAddress() LoadLibrary() DLL
- LoadLibrary和GetProcAddress获得API的地址
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- 动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
- LoadLibrary 和 GetProcAddress、FreeLibrary
- LoadLibrary 和 GetProcAddress、FreeLibrary
- LoadLibrary 和 GetProcAddress、FreeLibrary
- LoadLibrary 、 GetProcAddress和FreeLibrary
- 显试调用DLL------GetProcAddress的使用
- java 中System.loadLibrary()调用c++Dll的路径问题
- LoadLibrary,GetProcAddress
- 获取LoadLibrary函数的代码
- 使用LoadLibrary调用DLL
- LoadLibrary加载dll失败的问题
- SSAS : 如何在http访问SSAS中指定语言标识
- 快速判断远程主机是否活动
- 现在出现一个使用msxml获取属性值的麻烦
- 一个资深SOHO程序员对新人的建议
- 什么是 DLL?
- 用LoadLibrary和GetProcAddress函数调用dll的代码有问题
- CP Socket编程 C/C++实现 (Windows Platform SDK)
- 报表ReportViewer显示图片--rdlc
- 我的青春谁做主--精彩语录
- 打印自身源代码的程序,一个通用方法
- 如何用vc创建和读取xml文件??
- 解读C++声明
- WINCE600的目录组织及PQOAL
- 当心编译器生成的隐含成员函数