You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++项目调用DLL函数遇两类错误求助:链接错误与访问违规

C++自定义DLL函数调用故障排查与修复

问题分析

1. 直接调用报错:未解析外部符号

该错误核心是链接器无法找到Connect函数的实现入口:

  • 头文件仅声明了导出函数,但调用方未正确标记该函数为导入,编译器无法识别这是外部DLL的函数;
  • 未链接DLL编译时生成的导入库(.lib文件),链接器缺少函数的地址信息。

2. 动态加载触发访问违例(0xC0000005)

异常源于调用空函数指针:

  • LoadLibrary可能因路径错误、依赖缺失等原因加载失败,返回NULL后未做检查;
  • GetProcAddress未找到目标函数,返回NULL后直接调用,触发空指针访问。

修复方案

1. 修正DLL头文件(兼容导出/导入)

通过预处理器宏区分DLL编译时的导出逻辑和调用方的导入逻辑,避免声明冲突:

#pragma once

#define  _WINSOCK_DEPRECATED_NO_WARNINGS

#include <winsock2.h>
#include <Ws2tcpip.h>

#pragma comment(lib, "Ws2_32.lib")

// 编译DLL时需在项目属性中添加预处理器定义:MYDLL_EXPORTS
#ifdef MYDLL_EXPORTS
#define DllAPI extern "C" __declspec(dllexport)
#else
#define DllAPI extern "C" __declspec(dllimport)
#endif

SOCKET sock;
WSADATA initialisation_win32;

DllAPI int Connect(const char* address, unsigned int timeout);

2. 修复直接调用方式

  • 链接导入库:将DLL编译生成的MyDll.lib文件添加到调用方项目的链接器依赖中:
    右键项目 → 属性 → 链接器 → 输入 → 附加依赖项,添加MyDll.lib;
  • 或者在调用方代码中添加#pragma comment(lib, "MyDll.lib"),让编译器自动处理链接;
  • 确保MyDll.lib和头文件在调用方项目的搜索路径内,或直接放置到项目目录下。

3. 修复动态加载方式

必须添加DLL加载和函数地址获取的错误检查,避免空指针调用:

// 根据项目字符集选择LoadLibraryA(ANSI)或LoadLibraryW(宽字符)
HINSTANCE hGetProcIDDLL = LoadLibraryA("MyDll.dll");
if (hGetProcIDDLL == NULL) {
    DWORD errCode = GetLastError();
    qDebug() << "DLL加载失败,错误码:" << errCode;
    return;
}

typedef int (*CNCT)(const char*, unsigned int);
CNCT Connect = (CNCT)GetProcAddress(hGetProcIDDLL, "Connect");
if (Connect == NULL) {
    DWORD errCode = GetLastError();
    qDebug() << "获取Connect函数地址失败,错误码:" << errCode;
    FreeLibrary(hGetProcIDDLL);
    return;
}

const char* adrr = "192.168.2.10";
if (Connect(adrr, 10))
    qDebug() << "Card connected";
else 
    qDebug() << "card disconnected";

FreeLibrary(hGetProcIDDLL);

注意:若项目为Unicode字符集,需确保DLL文件名使用宽字符串(如L"MyDll.dll"配合LoadLibraryW),否则可能导致加载失败。


内容的提问来源于stack exchange,提问作者Soukaina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:27:46