PathFileExistsW无法通过编译
如下代码中,无法编译过关,请问各位大侠是什么原因?感谢各位亲们!
// ---------------------------------------------------------------------------
#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";注释掉就可以编译通过,不知道这是什么原因?