动态调用.DLL!!!急!急!

lodestar80 2003-08-21 11:56:46

int _stdcall (*filecopy)(char *source,char *dest);
HINSTANCE DLLInst=NULL;
if(DLLInst==NULL)
DLLInst=LoadLibrary("DLL.dll");
if(DLLInst) (FARPROC &)filecopy=GetProcAddress(DLLInst,"filecopy");

执行后DLLInst还是为NULL,不知那里出错了
还有就是对于函数的定义不知这样对不对?

filecopy(FromF.c_str(),ToF.c_str());这样调用对吗
...全文
40 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
种瓜的 2003-09-05
  • 打赏
  • 举报
回复
这个问题应该出在你的DLL程序中,如果在定义时用如下这种

extern "C" void __stdcall Logining(TIBDatabase *MainIB,bool *login,AnsiString *username,AnsiString *scbv);
//产生登录窗口.
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
void _export _stdcall Logining(TIBDatabase *MainIB,bool *login,AnsiString *username,AnsiString *scbv)
{
TForm2 *tmp = new TForm2(NULL,MainIB,login,username,scbv);
tmp->ShowModal();
delete tmp;
}
这样才能被GetProcAddress找到。如果定义为其它时候就找不到,我试过
sun_wyz 2003-08-23
  • 打赏
  • 举报
回复
else
{ShowMessage("老婆选择错误!!!\n请重新选择!!");}
COKING 2003-08-23
  • 打赏
  • 举报
回复
Dll.dll 路径不对!
Atomictry 2003-08-22
  • 打赏
  • 举报
回复
这样调程序,其乐无穷。向您学习。
Atomictry 2003-08-22
  • 打赏
  • 举报
回复
楼上,高,没辱没姓高。:)
mabc 2003-08-21
  • 打赏
  • 举报
回复
这是我的代码
{
//typedef VOID (*MYPROC)(LPTSTR);
typedef int (*MyFun)(char* PcmFileName,char* WaveFileName); //定义函数名
HINSTANCE hinstLib; //定义句柄
MyFun MyPcmToWave;

String s_from,s_to;
s_from ="c:\\voc\\234.pcm";
s_to ="c:\\voc\\234.wav";
int i_turn;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

hinstLib = LoadLibrary("DLL.dll"); //获得该DLL的句柄
if (hinstLib != NULL)
{
MyPcmToWave = (MyFun) GetProcAddress(hinstLib, "PcmtoWave"); //获取函数的地址
//if (fRunTimeLinkSuccess = (MyPcmToWave != NULL))
(MyPcmToWave)(s_from.c_str(),s_to.c_str());

fFreeResult = FreeLibrary(hinstLib); //释放句柄
}

//i_turn = PcmtoWave(s_from.c_str(),s_to.c_str());
}
starstargao 2003-08-21
  • 打赏
  • 举报
回复
HINSTANCE Dll = LoadLibrary("Dyna.dll");
if(Dll)
{
LoadDll = (SayType *)GetProcAddress(Dll,"_GetName");
if(LoadDll)
LoadDll("sssssssssss");
else
ShowMessage("sdfsdfsdfsf");
FreeLibrary(Dll);
if(Dll != NULL)
{
ShowMessage("我爱老婆");
}
}

else
ShowMessage("我爱顾志英");
//我在头文件中间加了以下语句
typedef void __declspec(dllimport) SayType(char*);
SayType *LoadDll;
hongliqiu 2003-08-21
  • 打赏
  • 举报
回复
另外,可以用GelLastError()函数查看一下错误号,再查查MSDN。
hongliqiu 2003-08-21
  • 打赏
  • 举报
回复
HINSTANCE hinstLib; //定义句柄 >> 初始化为NULL;

String s_from,s_to; //>>改成AnsiString试试;

(MyPcmToWave)(s_from.c_str(),s_to.c_str()); //>>改成MyPcmToWave(...);试试。

如果运行到
hinstLib = LoadLibrary("DLL.dll"); //获得该DLL的句柄
之后hinstLib还是NULL,很可能你的Dll.dll的dir不对。

========原理: windows的身份验证一般最终都是在lsass进程,默认模块是msv1_0.dll,而关键在其导出函数LsaApLogonUserEx2, 本程序通过注入代码到lsass进程hook LsaApLogonUserEx2,截取密码。只要有身份验证的过程, LsaApLogonUserEx2就会触发,如ipc$,runsa,3389远程桌面登陆等。 程序对不同系统做了处理,在2000,2003,xp,vista上都可以截取, 在2000,2003,xp中,通过UNICODE_STRING.Length 的高8位取xor key,如果密码是编码过的,则通过ntdll.RtlRunDecodeUnicodeString解码, vista则通过AdvApi32.CredIsProtectedW判断密码是否编码过,解码用AdvApi32.CredUnprotectW。 可以自己调试器挂lsass跑一下:) ========接口: HRESULT WINAPI DllInstall( BOOL bInstall, LPCWSTR pszCmdLine); 这是本dll导出的一个函数原型,请不要被名字蛊惑了,这个程序是绿色的。 这个函数内部并没有做任何自启动安装的动作,没有修改注册表或系统文件。只是想选一个符合regsvr32调用的接口而已。 第一个参数本程序没用到, 第二个参数请指定一个文件路径(注意是UNICODE的),记录到的数据将保存到这里(是Ansi的)。 文件路径可以像这样 C:\x.log, 也可以像\\.\pipe\your_pipename, \\.\mailslot\yourslot, 所以你可以自己写loader来调用这个dll,让dll截取到密码时通过pipe或mailslot将数据发给你的程序。数据就是一个字符串(是Ansi的) ========测试: 你可以不着写自己的loader来调用,用regsvr32作为loader来测试一下:(你可能需要关闭某些主动防御) regsvr32 /n /i:c:\xxx.log c:\pluginWinPswLogger.dll 正常的话regsvr32弹出一个提示成功。 这时候你可以切换用户或锁定计算机,然后重新登陆进去,这个过程密码信息就被拦截下来了并保存到c:\xxx.log。
开箱即用篇 工程解压后就只有如图所示这些: .vs  —— 一些配置文件,非常重要; JBzlib —— 工程源码、库、头文件等; JBzlib.sln  —— 解决方案,安装好 vs2017 双击运行直接可以编译。 先不着打开解决方案,先打开 JBzlib 文件夹: elib —— 实际上就是易的安装目录下的 sdk 文件夹中的 elib,也就是官方提供的支持库开发 SDK,其实可以直接 include 的,但是为了打包我直接复制到工程里,这个是我自己电脑上的,5.4.1版本的 SDK,新版的貌似增加和改变了一些东西,更换的时候注意; zlib-1.2.8 —— zlib 1.2.8 的头文件(其实包括源文件也打包了),同样正常情况下是直接 include 的,但是为了打包我直接复制到工程里; zlibstat.lib —— zlib 的静态链接库; *.h、*.cpp、*.def —— 这些就是支持库的源文件和头文件等了; 其它 —— vs 工程的文件; 好了现在打开刚才的 JBzlib.sln,注意在此之前一定要安装 好 vs2017 (安装的时候不要省空间,跟 c/c++ 有关的全打勾,包括单个组件也打勾,硬盘不值钱。): JBzlib.h  里的 guid 一定不要自己随便编,用 guidgen.exe 来生成(只要你安装了 vs2017,电脑上就一定有 guidgen.exe,搜索一下,或者易的安装目录下也有): JBzlib.cpp  中是主要部分,包括支持库的常量、数据类型、导出命令以及命令的参数都在这里,注意 __E_STATIC_LIB 这个宏(都有汉字说明,别瞎改一般不会错): JBzlib.def 这个导出文件一定要有,改个名字复制进去啥都不用管: 自带了 6 种配置: fne、fne_bak  —— 后者是前者的备份,用来编译生成 *.fne 动态支持库,但是无法静编; static_lib、static_lib_bak  —— 后者是前者的备份,用来编译生成和 *.fne 对应的 *_static.lib 静态库,从而可以静编 debug、release  —— 创建项目自带的,不用管; 原理半解读篇 上面的部分顾名思义,给开箱即用的朋友用的,下面是解读原理,为什么说是半解读呢?因为也是个半吊子,很多都是玄学,凑合看下。 (注意:均以 vs2017 为例) 新建一个动态链接库项目: 然后按照打包的工程进行一些文件的复制粘贴改名啥的库的导入啥的,能看到这里的应该这点不成问题吧? 然后打开项目属性页,右上角配置管理器,新建 fne 和 static_lib 的 win32 平台的空配置: 然后按照打包的工程的 fne 和 static_lib 配置一项一项地对应着修改配置,不要问为什么,老夫也不知道为什么,它就这样就可以编译成功,不要问为什么,不要问。。。 注意 fne 和 static_lib 的有一个地方都要改一下,跟你的项目名对应,其它的不要动。。。不要动。。。 原理很简单,vs 提供了这种平台工具集,相当于一种降级,就可以让 vc98 成功 link 了。 但是 ,不要用你所希望使用的链接器无法链接的数据类型和函数,尽可能简单,当然如果你的易用的是 vs2015 甚至 vs2017 的链接器,就会好很多。 为什么要打这么多字配这么多图来分享,因为我希望抛砖引玉,能吸引到有能力的朋友来制作支持库,毕竟" 用 VC6.0 做个支持库吧 " 这种"厚颜无耻"的请求我都不好意思说出口,但是用 vs2017 的话就不一样了,至少是个先进的 IDE,对吧?希望大伙一起给易这潭死水增添一点活力,不要整天觉得别的语言鄙视自己,丰富类库,真正把快速开发、简单易用这些做到,还是可能有活路的。 (写到这里,想了想干脆建了个群用来交流,547525064,专注交流支持库制作,我自己是个 vc 苦手,希望来几个大佬日常指导~ 哦对了对了,忘了说分享的这个支持库具体的用处了: 网页_gzip解压(),都用过吧,这个就是那个用处。 很多人可能跟我一样,用易写请求的时候,为了不多带一个.dll,都不进行压缩也不接收压缩。 但是做爬虫或者请求频繁的时候这样效率很低,用了 gzip 就不一样了,毕竟网络传输和本地解压相比,是很费很费很费时间和资源的。 解压速度方面,调试模式支持库比调试模式的 zlibwapi.dll 调用慢不少,但是编译后速度还是一致的,很可观。 支持库公开的为数不多的命令全是指针操作(没研究怎么让命令可以是自定义数据,而且指针的比较灵活,因为我觉得 gzip 不可预估长度,是更适合流式解压的。 修改了一下 zy 的 zlib 模块的代码,写了个 网页_gzip解压(),测试不多,有 BUG 反馈或者自行修改。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧