Windows编程-未装入dll或函数未找到错误?undefined reference to xxx

举个例子

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <winternl.h>
using namespace std;
int main(int argc, char* argv[])
{
    PROCESS_BASIC_INFORMATION pi;
    memset(&pi, 0, sizeof(pi));
    NTSTATUS re = NtQueryInformationProcess(OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17720),
                              ProcessBasicInformation,/*还必须用这个,不能用0*/
                              &pi,
                              sizeof (pi),
                              NULL);
    if(NT_SUCCESS(re))
    {
        wcout << "OK" << endl;
    }
    getchar();
    return 0;
}

这个程序没有静态编译错误,但有动态运行错误
原因在于 NtQueryInformationProcess 函数,这个函数包含在 winternl.h 头文件里
但是在运行时会报错:
undefined reference to Ntqueryinformati onprocess 未定义错误

原因是程序在链接的时候没有装入 NtQueryInformationProcess 函数的dll,解决方法:
查询官方资料,找到它在那个dll库里面,手动链接
涉及到函数指针

例子:
NtQueryInformationProcess 在 Ntdll.dll 里

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <winternl.h>
//定义一个函数指针
typedef NTSTATUS (WINAPI *QT)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);

using namespace std;
int main(int argc, char* argv[])
{
    HMODULE hModule = 0;
    hModule = LoadLibrary(L"Ntdll.dll");
    QT NtQuery;
    if(hModule)
    {
        NtQuery = (QT)GetProcAddress(hModule, "NtQueryInformationProcess");
    }

    PROCESS_BASIC_INFORMATION pi;
    memset(&pi, 0, sizeof(pi));
    NTSTATUS re = NtQuery(OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17720),
                              ProcessBasicInformation,/*还必须用这个,不能用0*/
                              &pi,
                              sizeof (pi),
                              NULL);
    if(NT_SUCCESS(re))
    {
        wcout << "OK" << endl;
    }
    getchar();
    return 0;
}

可以正确运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子砰砰枪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值