VC DLL 的问题 导出类 人才来帮忙

来源:百度知道 编辑:UC知道 时间:2024/06/17 09:06:41
这样子的

我编写了一个DLL (A),里面有类,还有命名空间......

然后让其它程序使用,都知道了,把H头文件和LIB文件弄到工程里面,
#pragma comment(lib,"XX.LIB")
这样就可以使用了,完全没有问题

如果被使用目标程序是EXE就没问题了,因为EXE它会加载EXE运行目录下面的DLL文件,我也知道如果找不到它会到系统目录下面去找(前提是我不能把它弄到系统目录下面),,我把EXE和DLL放到同一目录下面,运行就没有问题,,,一切正常

现在我又写了个DLL(B),这个DLL要使用DLL(A)的里面类,也按照上面的方法,弄H和LIB文件,也可以,也就是说两个DLL文件在同一目录下面。就可以了,
当这个DLL(B)程序逻辑是这样的

它运行一个函数,这个函数实现的功能是把 DLL(B)本身注入到另外一个进程当中(这个进程嘛,不固定),问题就出来了,因为使用注入技术,
DLL(B)要加载DLL(A),加载路径就是在同一目录下面,可悲的是,注入的目标进程的可执行程序并没有和DLL(A)在同一目录,因为它是动态的,不能预先知道它的位置。
注入成功后,目标进程会出错,说找不到DLL(A),不能加载,如果把DLL(A)复制到目标进程的安装位置,就可以,不会有问题(关键是我不能那样做)

还有个条件是,我不能把DLL(A)复制到系统目录下面去; (为什么不能,你们就别问了)

如果DLL(A)里面导出的一些常规函数,不是在类里面的,我知道可以用动态加载
LoadLibrary GetProcAddress 来弄到函数指针,使用就行

关键我现在用的是一个类,我因为还没有使用过如何从DLL加载一个类 是指针的那种

也就是说,我不使用那个DLL的LIB文件,只使用它的H文件和 LoadLibrary,怎么使用DLL(A)中的类,

我狂汗,我语文打了72分了,所以呢不知道有几个人能明白我的意思,,如果不明白的我加你Q,详细给我解答吓,如果同时你是热心的人,我再加200分给

嗯,语文果然够差,稍微看懂了些,要那么麻烦么?
就是说运行你的EXE将B.DLL注入到别的进程,B.DLL也要用到A.DLL,是不?并且不能将DLL放到系统目录,呵呵,啥原因?
那你在运行你的EXE程序、在要将B.DLL注入到别的进程前,将A.DLL复制过去不就行了,当B.DLL被卸载时在把A.DLL删除就OK了

你的描述还算清楚。。。但很久没碰了,给你个网址看看能不能帮助你
http://ks.pconline.com.cn/index.jsp?q=VC%2B%2B%B6%AF%CC%AC%C1%B4%BD%D3%BF%E2%28DLL%29%B1%E0%B3%CC%C9%EE%C8%EB%C7%B3%B3%F6&image.x=19&image.y=10

感觉你做的东西很邪恶^_^ 从DLL动态创建类有两个办法:
1) 在原有dll的基础上再封装一个DLL,该DLL静态导入原来的带类的DLL,而导出所需要的接口为标准的C函数。此方法简单易行,但是需要多一个DLL,不知道你介意不介意。不过既然原来就有两个了,也不在乎再多一个吧。
2)C++使用DLL导出无非就是导出它的构造、析构函数和成员函数等。你先写一个静态调用该类的程序,进入反汇编看看调用过程,然后把调用的相关函数都改成调用由LoadLibrary() GetProcAddress()获取的函数地址就可以了。