【发布时间】:2022-01-08 06:30:07
【问题描述】:
我有一些以前在 C++Builder 6 中编译和运行的代码。我想在 10.4.2 中重新编译它并构建 32 位和 64 位 Windows 目标。
现有代码使用经典编译器编译,但是当我尝试使用 clang 编译器编译时,我得到了可怕的 ICE:
内部编译器错误:0 @ 00000000
通过使用#ifdefs 删除部分代码,我已经将其追踪到函数的声明方式。我没有尝试过任何工作,这让我觉得我一定错过了一些非常基本的东西。
仍然适用于经典编译器的原始代码:
extern "C" {
BOOL WINAPI __declspec(dllexport) GetLogonSIDFromToken (HANDLE hToken, PSID *ppsid);
BOOL WINAPI __declspec(dllexport) GetCurrentProcessLogonSID (PSID *ppsid);
BOOL WINAPI __declspec(dllexport) GetLogonSIDFromAccountName(char *lpszUserName, PSID *ppsid);
VOID WINAPI __declspec(dllexport) FreeLogonSID (PSID *ppsid);
PSECURITY_DESCRIPTOR WINAPI __declspec(dllexport) AddAceToNewSecurityDescriptor(PSECURITY_DESCRIPTOR psd, PSID psid, DWORD dwType, DWORD dwFlags, DWORD dwMask);
BOOL WINAPI __declspec(dllexport) SetUserObjectNullDacl(HANDLE hObject);
BOOL WINAPI __declspec(dllexport) AddAceToUserObject(HANDLE hObject, PSID psid, DWORD dwType, DWORD dwFlags, DWORD dwMask);
BOOL WINAPI __declspec(dllexport) AddAceToWindowStation(HWINSTA hwinsta, PSID psid);
BOOL WINAPI __declspec(dllexport) AddAceToDesktop(HDESK hdesk, PSID psid);
}
现在我已经尝试了很多东西,并查看了 Windows SDK 标头,但如果我将其放入我的代码中:
extern "C" {
// this is lifted directly from winbase.h
WINADVAPI
BOOL
WINAPI
LogonUserExW (
_In_ LPCWSTR lpszUsername,
_In_opt_ LPCWSTR lpszDomain,
_In_opt_ LPCWSTR lpszPassword,
_In_ DWORD dwLogonType,
_In_ DWORD dwLogonProvider,
_Outptr_opt_ PHANDLE phToken,
_Outptr_opt_ PSID *ppLogonSid,
_Outptr_opt_result_bytebuffer_all_(*pdwProfileLength) PVOID *ppProfileBuffer,
_Out_opt_ LPDWORD pdwProfileLength,
_Out_opt_ PQUOTA_LIMITS pQuotaLimits
);
/*
BOOL
WINAPI
GetLogonSIDFromToken(
_In_ HANDLE hToken,
_Outptr_opt_ PSID *ppsid
);
*/
/*
BOOL
APIENTRY
GetLogonSIDFromToken(
_In_ HANDLE hToken,
_Outptr_opt_ PSID *ppsid
);
*/}
它编译得很好(但显然我的函数没有声明),但是如果我取消注释第二个或第三个声明,我会收到 ICE 错误。
任何人都可以为我提供任何指针(不是双关语)吗?
【问题讨论】:
-
是否有一些项目路径仍指向经典包含目录或库目录或类似目录?
-
感谢 Ted 的想法,我认为情况并非如此,我使用的唯一不随产品一起提供的标头就是这个。我看不出包含另一个头文件或路径如何意味着编译器很乐意接受第一个声明(Windows API 调用)但没有我自己声明的函数的变体(我已经尝试过)。
-
好吧,这是一个很长的镜头:)
-
发现问题完全不是我的预期……我会发布答案。
标签: c++builder