20CN网络安全小组第一代论坛
发表新主题  发表回复

个人资料 | 社区目录 用户登录 | | 论坛搜索 | 常见问题 | 论坛主页
  下一个最老的主题   下一个最新的主题
» 20CN网络安全小组第一代论坛   » 电 脑 技 术   » 编程破解   » DLL编程讨论

   
作者 标题: DLL编程讨论
病毒
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
俺在其他论坛的讨论。

dino_


发表时间: 04-09-2001 10:14
--------------------------------------------------------------------------------
1。在C++ Builder中如何调用外部动态链接库(.dll)~~~~~~~
2。外部动态链接库中的函数原型包含非法字符的解决方法~~~~~~~~``

3。在C++ Builder中如何连接外部数据库(如Access)~~~~~~~~``

------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

病毒


发表时间: 04-16-2001 20:00
--------------------------------------------------------------------------------
1,动态加载LoadLibrary,GetProcAddress
2,看你怎么声明的,DLL中函数要通用那么
以extern "C" 方式声明,还有CB默认调用
定义为__cdecl你需要改成__stdcall方式

3,不要用BDE,用ADO控件直接连接

(1,2问题可以参见,我贴在网络安全里的
《系统编程阶进》,里面有详细原代码)


------------------ http://www.intellecpro.com/jiasys/myprogram.htm http://www.intellecpro.com/jiasys/myarts.htm


dino_


发表时间: 04-18-2001 21:49
--------------------------------------------------------------------------------
1.我已经用静态挂上了~~~
2。运行时出现“[Linker Error] Unresolved external '__stdcall Remote_Initlize(long)' referenced from D:\..\dddd.OBJ”
怎么回事儿~~~请指点迷津~

------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

病毒


发表时间: 04-19-2001 04:45
--------------------------------------------------------------------------------
编译时候就出错了?俺让你看的帖子不知道你看了没
从俺帖子里面给你摘了几句出来
//以标准C方式声明DLL中函数

extern "C" __declspec(dllexport) BOOL WINAPI install_hook(HWND hWnd);

BOOL WINAPI install_hook(HWND hWnd)
{
}

还不行就把你代码贴上来

------------------ http://www.intellecpro.com/jiasys/myprogram.htm http://www.intellecpro.com/jiasys/myarts.htm

deric


发表时间: 04-19-2001 07:31
--------------------------------------------------------------------------------

------------------
...

dino_


发表时间: 04-19-2001 14:48
--------------------------------------------------------------------------------
我碰到的问题不太一样~~~我是在实现调用第三方的dll文件~~~~~
其中的原型是如何声明的我并不清楚~~~~~~`也无法打开dll文件~~~只能通过dll的头文件获取函数名信息~~~~

他是如何做的外部声明我就不清楚了~~~~~~
如果是标准格式我应该能正确调用吧~~~~~~~

------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

dino_


发表时间: 04-19-2001 14:52
--------------------------------------------------------------------------------
静态调用的问题~~~~~
调用时在程序中include dll的.H文件~~~~
在工程中加入.lib文件就可以了么?~~~~~~
用不用对.dll文件进行声明~~~~

------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

病毒


发表时间: 04-19-2001 19:20
--------------------------------------------------------------------------------
原来那个DLL不是你写的,第三方DLL除非你知道
他的声明,参数等,否则光知道函数名是无法使用的
既然他给出了头文件,那么在里面就应该有函数调用
规则,你把头文件里你所调用的DLL函数声明定义
贴上来。
------------------ http://www.intellecpro.com/jiasys/myprogram.htm http://www.intellecpro.com/jiasys/myarts.htm

dino_


发表时间: 04-20-2001 10:49
--------------------------------------------------------------------------------
# ifndef __VODSERVW_H
# define __VODSERVW_H
# ifndef __HAVEONELOOK___
# define HAVEONELOOKLIB___ __declspec(dllimport)
# else
# define HAVEONELOOKLIB___ __declspec(dllexport)
# endif

# ifndef __ISSOMEONECALL___
# define ISSOMEONECALLLIB___ __declspec(dllimport)
# else
# define ISSOMEONECALLLIB___ __declspec(dllexport)
# endif

# ifndef __REMOTE_INITLIZE___
# define REMOTE_INITLIZELIB___ __declspec(dllimport)
# else
# define REMOTE_INITLIZELIB___ __declspec(dllexport)
# endif

# ifndef __REMOTE_OPERATE___
# define REMOTE_OPERATELIB___ __declspec(dllimport)
# else
# define REMOTE_OPERATELIB___ __declspec(dllexport)
# endif

#define VB
#ifdef VB
HAVEONELOOKLIB___ long pascal HaveOneLook(void);
ISSOMEONECALLLIB___ long pascal IsSomeOneCall(void);
REMOTE_INITLIZELIB___ long pascal Remote_Initlize(long DeviceCode);
REMOTE_OPERATELIB___ long pascal Remote_Operate(long CommandCode, long ChannelNumber);
#else
HAVEONELOOKLIB___ DWORD HaveOneLook(void);
ISSOMEONECALLLIB___ DWORD IsSomeOneCall(void);
REMOTE_INITLIZELIB___ DWORD Remote_Initlize(DWORD DeviceCode);
REMOTE_OPERATELIB___ DWORD Remote_Operate(DWORD CommandCode, DWORD ChannelNumber);
#endif

#endif


------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

病毒


发表时间: 04-21-2001 00:13
--------------------------------------------------------------------------------
你的用法代码呢?
你试下这样做

HAVEONELOOKLIB___ __stdcall DWORD HaveOneLook(void);

extern "C" HAVEONELOOKLIB___ __stdcall
DWORD HaveOneLook(void);

其实WINAPI就是__stdcall这在头文件里有声名


------------------ http://www.intellecpro.com/jiasys/myprogram.htm http://www.intellecpro.com/jiasys/myarts.htm

dino_


发表时间: 04-21-2001 20:05
--------------------------------------------------------------------------------
OK~~~~I'll try......
------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

dino_


发表时间: 04-23-2001 22:20
--------------------------------------------------------------------------------
俨然还是不行~~~~~
还报那个错~

用法?~~~我就是直接的函数调用~

------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

病毒


发表时间: 04-24-2001 15:33
--------------------------------------------------------------------------------
俺没有你的那个DLL,所以只能照你提供的形式给你
写了一个列子,用静态,动态均方式都已调试好,把代码贴给你参考。
DLL文件

/*
GlobalMemoryStatus API返回MEMORYSTATUS结构
中的dwTotalPhys(返回内存总量)正好是一个DWORD值,这里就用他了,还有那个Remote_Initlize因为你只是调用错误,我忽略了具体操作,通过接收一个
DWORD参数,进行运算或直接返回了一个DWORD。
*/

//---------------------------------------------------------------------------

#include <windows.h>
#pragma argsused

extern "C" __declspec(dllexport) DWORD WINAPI HaveOneLock(void);

__declspec(dllexport) DWORD Remote_Initlize(DWORD DeviceCode);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------


DWORD WINAPI HaveOneLock(void)
{
MEMORYSTATUS mem;
mem.dwLength=sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&mem);
return mem.dwTotalPhys/1024/1024;
}

DWORD Remote_Initlize(DWORD DeviceCode)
{
return DeviceCode*2;
}


静态调用:

在Project中选择Add to Project将Test.lib
加入。然后在头文件中声明,俺是按照你所给
的头文件里类型声明的,如下:

#define REMOTE_INITLIZELIB___ __declspec(dllexport)

extern "C" REMOTE_INITLIZELIB___ DWORD WINAPI HaveOneLock(void);

REMOTE_INITLIZELIB___ DWORD Remote_Initlize(DWORD DeviceCode);

然后直接调用

void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD dwMem,DeviceCode;
dwMem=HaveOneLock();
ShowMessage(dwMem);
DeviceCode=Remote_Initlize(Edit1->Text.ToInt());
ShowMessage(DeviceCode);
}

没有任何问题。

动态调用:

在头文件里声明函数指针
private: // User declarations
DWORD(WINAPI *HaveOneLock)(void);

调用
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD dwMem;
HINSTANCE DLLInst=LoadLibrary("Test.dll");
if(DLLInst)
{
HaveOneLock=(DWORD(WINAPI *)(void))
GetProcAddress(DLLInst,"HaveOneLock");
if(HaveOneLock)
{
dwMem=HaveOneLock();
ShowMessage(dwMem);
}

else ShowMessage("FUNError!");
}
else ShowMessage("DLLError!");
}
//---------------------------------------------------------------------------

没有任何问题

俺再说几点,一般象我们写DLL给其他编程人员使用
首先要做到通用,就是说你不知道对方要在什么编译器
下调用,可能是VC也可能是VB,比如说VC,它无法直接加载CB写的DLL,只能动态调用,所以应该是extern "C"声明函数,和用__stdcall方式,上面已经说了CB默认方式是__cdecl方式,这就是为什么依据我的经验让你写为 extern "C" REMOTE_INITLIZELIB___ DWORD WINAPI HaveOneLock(void);以上非常详细介绍了调用约定,
声明方法,已经说的很全面了,并给出了实列,我想应该不会有什么问题了。


------------------ http://www.intellecpro.com/jiasys/myprogram.htm http://www.intellecpro.com/jiasys/myarts.htm


[该贴子已经被病毒编辑过。(编辑时间:04-24-2001)]

dino_


发表时间: 04-25-2001 08:26
--------------------------------------------------------------------------------
谢谢~~~~真是太谢谢了~~~~~~``
现在我们查出的一个可能原因是~~~C++ Builder对其他C写的dll的兼容性问题,因为我们使用应用程序看那个dll中的函数原型,他的函数名是类似这样的:
Remote_Init@@YTZ@YZ
应该是用某个版本的C++编写的~~后面的非法字符是编译系统自己加上的~~~~````调用的时候都正常~只能是兼容性的问题了~~``据说CB的兼容性并不好~

我们想到的另一个途径是~~~能否用dll中的函数原型Index号调用~~~``但具体语法就没人会了~~~~``请教实现方法~~~`是在dll文件的头文件声明中改动么?

------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......


病毒


发表时间: 04-25-2001 14:42
--------------------------------------------------------------------------------
噢,现在俺才知道,原来你们用的那个DLL不是
开发商提供的?其实不论那个C写的DLL,只要它
是按通用方式写,都可以调用,说CB不兼容,其实就是
上面所说的,你在CB中写DLL,放在VC下无法静态连接,反过来一样,俺不知道你是否动态加载?试过没有?因为俺写给其他人员用的DLL,或者拿来通用的DLL
还没有碰到过那个是不能调用的,还有就是,俺猜测它这些DLL书写有问题,没有很好考虑到兼容性。函数声明是否有extern "C" 是非常关键的,如果没有那么他就不是以C形式出现的。而是C++形式,以C形式编译出来的函数名称如果在汇编编译器看来,将在函数名前加下划线“_”。一个__stdcall形式(即WINAPI)如HaveOneLock(void)经过编译后的汇编形式是 _HaveOneLock@()。再来说一下C++编译的,在缺省情况下.一个C++的函数经过C++编译器后编译出的函数名包括函数名,所属的类,参数类型,调用约定,返回类型.而且更要命的是这么多的信息,只有函数名和类名在编译后还依稀可见.其他就是一长串的乱七八糟的字母,根本就是无法辨认其意义。这也就意味着只有在其本身编译器中可识别。再其他不同编译器中根本无法调用。再回来看看,想想WIN32 SDK提供的LIB是怎样适应不同编译器调用的呢?他们正式以C方式声明的,而不是C++,这在头文件里随处可见。你给的那种形式,看起来应该不是通用的,如果有DLL的原代码改起来很容易,但现在你只有动态调用一下试试,如果还是不行,那么可以去找提供此套DLL的开发商咨询一下。

------------------ http://www.intellecpro.com/jiasys/myprogram.htm http://www.intellecpro.com/jiasys/myarts.htm

dino_


发表时间: 04-25-2001 22:00
--------------------------------------------------------------------------------
okokokokok~~~~~~````````
------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

dino_


发表时间: 04-26-2001 10:36
--------------------------------------------------------------------------------
问题终于解决了~~~~~~```
感谢病毒一段时间以来不厌其烦的鼎力支持~~~`

------------------
我是你温暖的手套,冰冷的啤酒,阳光味的衬衫......

IP: 已记录
小小瓶子
未注册


图标 1  发表于         编辑/删除帖子   引用原文回复  
我有点头晕.还没有看明白.

------------------
沧海一声笑
滔滔两岸潮
浮沉随浪
只记今朝
苍天笑
纷纷世上潮
谁负谁胜出
天知晓
江山笑
烟雨遥
涛浪汹尽红尘俗世几多娇

IP: 已记录

 
发表新主题  发表回复 关闭主题 突出主题 移动主题 删除主题 下一个最老的主题   下一个最新的主题
 - 适于打印的主题视图
转到:
联系我们 | 20CN网络安全小组

Powered by Infopop Corporation
UBB.classic™ 6.5.0
NetDemon修改版 1.5.0, 20CN网络安全小组 版权所有。