如何在VC6中调用系统DLL中的函数?

LJN 2000-02-19 07:59:00
加精
1.我想调用kernel32.dll中的函数,但vc总是报函数未定义,如何搞定它?

2.很容易得到一些对象据柄,但不知怎么使用他们, 如: FARPROC 等等.
...全文
872 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
aznarble 2000-08-11
  • 打赏
  • 举报
回复
csDllPath = "Kernel32.dll";
HINSTANCE hInstLib = ::LoadLibrary(csDllPath);
if (hInstLib != NULL)
{
//Declaration of function prototype
HRESULT (WINAPI *ProcFunctionName)(PROTOTYPE);
// Get the process address in Dll file
ProcFunctionName= reinterpret_cast<HRESULT (WINAPI *)(PROTOTYPE)>
(::GetProcAddress(hInstLib, "FunctionName"));
if ((ProcFunctionName!= NULL))
{
// Execute the FunctionName
if( SUCCEEDED( (ProcFunctionName)(PROTOTYPE)))
{
}
}
::FreeLibrary(hInstLib); // Free Dll
}
以上这段代码似乎是NT/2000下通用的(PROTOTYPE指函数参数原型),我已用过N次,都成功的调用了系统DLL中的函数。但要注意以下几点。
1)在声明DLL中的函数原型时如果是系统API函数最好加上强制类型转换(WINAPI *)。
2)一部分函数根据环境会存在Unicode与非Unicode的不同函数名。通常在预编译时加入:

#ifdef UNICODE
#define FunctionName "FunctionNameW"
#else
#define FunctionName "FunctionNameA"
#endif
open 2000-08-10
  • 打赏
  • 举报
回复
查看你需要的函数的头文件(YYYY.h)和相应的库文件(XXX.lib),把 YYYY.h 包含
在你调用此函数的文件中,可用MSDN查看,
然后#pragma comment(lib,"XXX.lib")

#include "YYYY.h"
#pragma comment(lib,"XXX.lib")
open 2000-08-10
  • 打赏
  • 举报
回复
查看你需要的函数的头文件(YYYY.h)和相应的库文件(XXX.lib),把 YYYY.h 包含
在你调用此函数的文件中,可用MSDN查看,
然后#pragma comment(lib,"XXX.lib")

#incldue "YYYY.h"
#pragma comment(lib,"XXX.lib")
LJN 2000-03-22
  • 打赏
  • 举报
回复
发分了! 见者有份!
LJN 2000-02-24
  • 打赏
  • 举报
回复
谢谢各位的掺和:

我已经自己研究出来了。为对次感兴趣的网友公开一下:

typedef int (stdcall * MyFunction) (DWORD lParam,DWORD wParam)


HMODULE hModule;

hModule = ::LoadLibrary("kernel32.dll");

MyFunction = ::GetProcAddress(hModule,"RegisterServiceProcess");

MyFunction(::GetCurrentProcessID(),1);

以上例程可以使程序在CTRL-ALT-DEL中隐藏,在98上通过,NT未试,调用的是
Kernel32.dll.

大家觉得这150分是不是该给我自己?

备注:大家千万别以为有以上代码就可作黑客程序,因为监测内存的软件依然
可以发现它。
Un1 2000-02-23
  • 打赏
  • 举报
回复
直接使用不就行了?!比如:

::SendMessage(mhWnd, WM_COMMAND, 0, 0);
Star 2000-02-23
  • 打赏
  • 举报
回复
blaise, 我想你是使用9x的吧,NT下是可以使用LoadLibrary的,
这是由于NT和9x对于4个系统dll的载入地址空间不同造成的。

LJN,MS在GetProcAddress中屏蔽了对Kernel32.dll的调用,如果
你确实要使用,应该有办法的,我再想想...
Star 2000-02-23
  • 打赏
  • 举报
回复
Unl&softdoctor,你们的方法不适用于Kernel32引出的未公开函数,你们可以试试!
jing 2000-02-23
  • 打赏
  • 举报
回复
menu
project->Setting->link->object/library modules:
softdoctor 2000-02-23
  • 打赏
  • 举报
回复
typedef HINSTANCE (*LOADLIB)(LPCTSTR lpszFileName);

{
BOOL bRet = TRUE;
HINSTANCE hInstance = LoadLibraryEx("kernel32.dll",NULL,LOAD_WITH_ALTERED_SEARCH_PATH);
if(hInstance)
{
LOADLIB pFun = (LOADLIB)GetProcAddress(hInstance,"LoadLibrary");
if(pFun)
{
HINSTANCE hCurInstance = (*pFun)(lpszFileName);
}
else
bRet = FALSE;
FreeLibrary(hInstance);
}
else
bRet = FALSE;
return bRet;
}
liu_z_j 2000-02-23
  • 打赏
  • 举报
回复
tell me too
blaise 2000-02-20
  • 打赏
  • 举报
回复
no, for kernel32.dll, you can't use loadlibray.
try to load kernel32.dll always fail.
So ,u can only use GetModuleHandle("Kernel32.dll") then call getprocaddress on that.
yaly 2000-02-20
  • 打赏
  • 举报
回复
tell me
Star 2000-02-19
  • 打赏
  • 举报
回复
LoadLibrary+GetProcAddress+FreeLibrary,
FARPROC你可以利用一些typedef的技巧.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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