标题:[讨论]编译DLL的问题
只看楼主
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
结帖率:83.33%
 问题点数:0 回复次数:4 
[讨论]编译DLL的问题

问题一:
一个MSG.DLL里面程序代码是:
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) void output()
{
MessageBox(NULL, "这是一个列子", "msg.dll", 0);
}
#ifdef __cplusplus
}
#endif

在一个EXE里面程序代码是:
#include <windows.h>
int main()
{
HMODULE hMod = LoadLibrary("msg");
if (hMod)
{
FARPROC a = GetProcAddress(hMod, TEXT("output"));
if (a)
a();
else
MessageBox(NULL, "无法获得msg.dll的output()函数", "错误", 0);
FreeLibrary(hMod);
}
else
MessageBox(NULL, "不能加载msg.dll", "错误", 0);
}

这个编译出来很成功没有任何问题.但这算是隐式加载还是显式加载,我看他们都是用到*.H文件的.

问题二:

这是DEVC++的DLL工程示范:
dllmain.cpp文件
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>

DllClass::DllClass()
{

}


DllClass::~DllClass ()
{

}


BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}

dll.h文件
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


class DLLIMPORT DllClass
{
public:
DllClass();
virtual ~DllClass(void);

private:

};


#endif /* _DLL_H_ */
怎么样让它弄成和问题1一样成功?

问题三:
有个文件d2hackmap.dll我有它的源代码.
但现在的问题是,我用LoadLibrary("d2hackmap");无法引进!?
返回LoadLibrary函数值时失败.........
LoadLibrary只是把DLL映射到EXE里这样都不行???
我用工具检测编译好的DLL倒出函数是:QueryInterface 地址:0000AC80

搜索更多相关主题的帖子: DLL windows 列子 编译 
2007-09-27 10:16
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
得分:0 
各位就说说看吧
2007-09-27 18:52
anthony634
Rank: 6Rank: 6
来 自:西南交大
等 级:贵宾
威 望:24
帖 子:653
专家分:10
注 册:2006-6-8
得分:0 

问题一:用LoadLibrary()加载DLL是显式加载,也叫动态加载,好处是可以根据条件来加载dll,即使系统没有这个dll程序仍然能运行,只是少了些功能
问题二:只是生成一个dll,做个加载模块使用里面的三个函数就可以完成了,DllMain 是进入点函数,如果你不需要知道加载dll的状态的话可以不实现它的,DLL_PROCESS_ATTACH 这几个值就根据名字来解析可以了,PROCESS_ATTACH 进程加载dll,PROCESS_DETACH 卸载 ,后两个是新线程加载,卸载。
问题三:LoadLibrary 这里就出错,可能是路径的问题,看下dll和exe是不是同一目录? 如果是GetProcAddress出错就看看是不是dll有问题

2007-09-27 20:21
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
得分:0 

路径是同一路径,我把文件复制到我编译的程序同目录.
在我刚调试完自己写的DLL后只是把加载的文件换了一下.
换成d2hackmap.dll
结果在LoadLibrary函数加载的时候返回失败值.

2007-09-27 20:28
anthony634
Rank: 6Rank: 6
来 自:西南交大
等 级:贵宾
威 望:24
帖 子:653
专家分:10
注 册:2006-6-8
得分:0 
如果LoadLibrary出现问题,那么问题是在你的dll,经常是dll的出口,如果是在找函数时出问题,那么下定义到处函数时有没有使用 extern "C",这个可能会漏了。

[此贴子已经被作者于2007-9-27 21:01:56编辑过]


2007-09-27 20:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-173230-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.125951 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved