PathFileExistsW无法通过编译

xiaoxue1999 2016-05-08 07:40:52
如下代码中,无法编译过关,请问各位大侠是什么原因?感谢各位亲们!
// ---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}

BOOL IsValidPEFile(TCHAR* strPathName) {
if (!PathFileExists(strPathName))
return FALSE;

// 根据 PE 签名判断当前文件是否合法的 PE 文件
HANDLE hFile = CreateFile(strPathName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
ShowMessage("Failed To Open File %s !\n" + AnsiString(strPathName));
return FALSE;
}

HANDLE hMMFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, NULL,
NULL, NULL);
if (hMMFile == INVALID_HANDLE_VALUE) {
CloseHandle(hFile);
return FALSE;
}

LPVOID pvMem = MapViewOfFile(hMMFile, FILE_MAP_READ, NULL, NULL, NULL);
if (!pvMem) {
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

// 是否包含有 DOS 签名
if (*(USHORT*) pvMem != IMAGE_DOS_SIGNATURE) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

// 是否包含有 NT 签名
if (*((DWORD*)((PBYTE) pvMem + ((PIMAGE_DOS_HEADER) pvMem)->e_lfanew))
!= IMAGE_NT_SIGNATURE) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);

return TRUE;
}

// ---------------------------------------------------------------------------
BOOL IsWindowsApp(TCHAR* strPathName) {
if (!PathFileExists(strPathName))
return FALSE;

// 根据 PE 签名判断当前文件是否合法的 PE 文件
HANDLE hFile = CreateFile(strPathName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
ShowMessage("Failed To Open File %s !\n" + AnsiString(strPathName));
return FALSE;
}

HANDLE hMMFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, NULL,
NULL, NULL);
if (hMMFile == INVALID_HANDLE_VALUE) {
CloseHandle(hFile);
return FALSE;
}

LPVOID pvMem = MapViewOfFile(hMMFile, FILE_MAP_READ, NULL, NULL, NULL);
if (!pvMem) {
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

// 是否包含有 DOS 签名
if (*(USHORT*) pvMem != IMAGE_DOS_SIGNATURE) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

// 是否包含有 NT 签名
if (*((DWORD*)((PBYTE) pvMem + ((PIMAGE_DOS_HEADER) pvMem)->e_lfanew))
!= IMAGE_NT_SIGNATURE) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

LPVOID pvOptionalHeader = (PBYTE) pvMem + ((PIMAGE_DOS_HEADER) pvMem)
->e_lfanew +sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER);

IMAGE_OPTIONAL_HEADER ioh;
CopyMemory(& ioh, pvOptionalHeader, sizeof(IMAGE_OPTIONAL_HEADER));

if (ioh.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);

return TRUE;
}

return FALSE;
}

BOOL IsCosoleApp(TCHAR* strPathName) {
if (!PathFileExists(strPathName))
return FALSE;

// 根据 PE 签名判断当前文件是否合法的 PE 文件
HANDLE hFile = CreateFile(strPathName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
ShowMessage("Failed To Open File %s !\n" + AnsiString(strPathName));
return FALSE;
}

HANDLE hMMFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, NULL,
NULL, NULL);
if (hMMFile == INVALID_HANDLE_VALUE) {
CloseHandle(hFile);
return FALSE;
}

LPVOID pvMem = MapViewOfFile(hMMFile, FILE_MAP_READ, NULL, NULL, NULL);
if (!pvMem) {
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

// 是否包含有 DOS 签名
if (*(USHORT*) pvMem != IMAGE_DOS_SIGNATURE) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

// 是否包含有 NT 签名
if (*((DWORD*)((PBYTE) pvMem + ((PIMAGE_DOS_HEADER) pvMem)->e_lfanew))
!= IMAGE_NT_SIGNATURE) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);
return FALSE;
}

LPVOID pvOptionalHeader = (PBYTE) pvMem + ((PIMAGE_DOS_HEADER) pvMem)
->e_lfanew +sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER);

IMAGE_OPTIONAL_HEADER ioh;
CopyMemory(& ioh, pvOptionalHeader, sizeof(IMAGE_OPTIONAL_HEADER));

if (ioh.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI) {
UnmapViewOfFile(pvMem);
CloseHandle(hMMFile);
CloseHandle(hFile);

return TRUE;
}

return FALSE;
}

void __fastcall TForm1::Button1Click(TObject *Sender) {
TCHAR* path = L"d:\\abc.exe";
if (IsWindowsApp(path))
Label1->Caption = "true";
}
// ---------------------------------------------------------------------------

编译错误信息:[ilink32 Error] Error: Unresolved external 'PathFileExistsW' referenced from E:\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\WIN32\DEBUG\UNIT1.OBJ
把最下面的一行if (IsWindowsApp(path)) Label1->Caption = "true";注释掉就可以编译通过,不知道这是什么原因?
...全文
237 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxue1999 2016-05-15
  • 打赏
  • 举报
回复
谢谢妖哥哥,妖哥哥太神了
ccrun.com 2016-05-10
  • 打赏
  • 举报
回复 1
首先这不是编译错误,这是链接错误。 其次解决方法是:将 PathFileExistsW 函数所在的 lib 文件 Shlwapi.lib 加入到工程中即可。注意是在 psdk 目录下。
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本中心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程中的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...

1,222

社区成员

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

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