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";注释掉就可以编译通过,不知道这是什么原因?
...全文
187 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxue1999 2016-05-15
  • 打赏
  • 举报
回复
谢谢妖哥哥,妖哥哥太神了
ccrun.com 2016-05-10
  • 打赏
  • 举报
回复 1
首先这不是编译错误,这是链接错误。 其次解决方法是:将 PathFileExistsW 函数所在的 lib 文件 Shlwapi.lib 加入到工程中即可。注意是在 psdk 目录下。

1,221

社区成员

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

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