调试DLL文件遇缺失入口错误:求助定位CreateTextDocument问题
DLL运行错误:Missing Entry: CreateTextDocument 解决方法
问题描述
运行rundll32.exe pwned.dll,CreateTextDocument时,系统提示:
Error in pwned.dll - Missing Entry: CreateTextDocument
目标是通过DLL在用户桌面创建并写入文本文件,相关代码如下:
#include <windows.h> #include <shlobj.h> #include <stdio.h> #include <tchar.h> void __stdcall CreateTextDocument(HWND hwnd, HINSTANCE hinst, LPSTR lpCmdLine, int nCmdShow) { // 获取用户桌面路径 TCHAR szFolderPath[MAX_PATH]; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0, szFolderPath))) { // 拼接文件完整路径 TCHAR szFilePath[MAX_PATH]; _stprintf_s(szFilePath, MAX_PATH, _T("%s\\MyTextFile.txt"), szFolderPath); // 创建文件 HANDLE hFile = CreateFile(szFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { // 写入示例文本 char szText[] = "This is some sample text that will be written to the file."; DWORD dwBytesWritten; WriteFile(hFile, szText, sizeof(szText), &dwBytesWritten, NULL); // 关闭文件句柄 CloseHandle(hFile); } else { MessageBox(hwnd, _T("创建文件失败。"), _T("错误"), MB_OK | MB_ICONERROR); } } else { MessageBox(hwnd, _T("获取桌面路径失败。"), _T("错误"), MB_OK | MB_ICONERROR); } }
已尝试两种命令运行:
rundll32.exe mydllfile.dll,CreateTextDocumentrundll32.exe mydllfile.dll
错误原因
Rundll32只能调用DLL导出表中存在的函数,当前代码中的CreateTextDocument函数未被导出,因此系统找不到该入口点。
解决方法
方法1:用__declspec(dllexport)修饰函数
直接在函数声明前添加__declspec(dllexport),让编译器自动将函数加入导出表:
#include <windows.h> #include <shlobj.h> #include <stdio.h> #include <tchar.h> // 添加__declspec(dllexport)标记导出函数 __declspec(dllexport) void __stdcall CreateTextDocument(HWND hwnd, HINSTANCE hinst, LPSTR lpCmdLine, int nCmdShow) { // 原函数内容不变 TCHAR szFolderPath[MAX_PATH]; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0, szFolderPath))) { TCHAR szFilePath[MAX_PATH]; _stprintf_s(szFilePath, MAX_PATH, _T("%s\\MyTextFile.txt"), szFolderPath); HANDLE hFile = CreateFile(szFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { char szText[] = "This is some sample text that will be written to the file."; DWORD dwBytesWritten; WriteFile(hFile, szText, sizeof(szText), &dwBytesWritten, NULL); CloseHandle(hFile); } else { MessageBox(hwnd, _T("创建文件失败。"), _T("错误"), MB_OK | MB_ICONERROR); } } else { MessageBox(hwnd, _T("获取桌面路径失败。"), _T("错误"), MB_OK | MB_ICONERROR); } }
方法2:使用模块定义(.def)文件
创建一个后缀为.def的文件,内容如下:
LIBRARY pwned EXPORTS CreateTextDocument @1
编译DLL时,将这个.def文件加入编译参数,链接器会根据文件内容导出指定函数。
编译与运行注意事项
- 确保使用支持__stdcall调用约定的编译器(如MSVC)编译DLL。
- 运行时必须使用正确的命令格式:
rundll32.exe pwned.dll,CreateTextDocument(注意逗号前后没有空格)。
内容的提问来源于stack exchange,提问作者Sebastian Birke
相关产品推荐
相关产品推荐

