为什么会崩溃? 我一直在敲我的头…我不能假装是C++的家伙……< TCHAR * pszUserName = userName.GetBuffer(); SID sid; SecureZeroMemory(&sid, sizeof(sid)); SID_NAME_USE sidNameUse; DWORD cbSid = sizeof(sid); pLog->Log(_T("Getting the SID for user [%s]"), 1, userName); if (!LookupAccountName(NULL, (LPSTR)pszUserName, &sid, &cbSid, NULL, 0, &sidNameUse)) { pLog->Log(_T("Failed to look up user SID. Error code: %d"),1, GetLastError()); return _T(""); } pLog->Log(_T("Converting binary SID to string SID"));

为什么会崩溃? 我一直在敲我的头…我不能假装是C++的家伙……< TCHAR * pszUserName = userName.GetBuffer(); SID sid; SecureZeroMemory(&sid, sizeof(sid)); SID_NAME_USE sidNameUse; DWORD cbSid = sizeof(sid); pLog->Log(_T("Getting the SID for user [%s]"), 1, userName); if (!LookupAccountName(NULL, (LPSTR)pszUserName, &sid, &cbSid, NULL, 0, &sidNameUse)) { pLog->Log(_T("Failed to look up user SID. Error code: %d"),1, GetLastError()); return _T(""); } pLog->Log(_T("Converting binary SID to string SID"));,c++,winapi,C++,Winapi,“正在为用户[x]获取SID”消息已写入,但随后应用程序崩溃。我假设is是LookupAccountName调用 编辑: 呜呜声用户名是一个MFC字符串参数6(cchReferencedDomainName)应该指向一个DWORD。当文档中说“如果ReferencedDomainName参数为NULL,则该参数必须为零”时,我相信这意味着引用的DWORD必须为0 尝试添加: DWORD cchReferencedDomainName = 0; if (!LookupAccountName(NUL

“正在为用户[x]获取SID”消息已写入,但随后应用程序崩溃。我假设is是
LookupAccountName
调用

编辑:

呜呜声
用户名
是一个MFC字符串

参数6(cchReferencedDomainName)应该指向一个DWORD。当文档中说“如果ReferencedDomainName参数为NULL,则该参数必须为零”时,我相信这意味着引用的DWORD必须为0

尝试添加:

DWORD cchReferencedDomainName = 0;
if (!LookupAccountName(NULL, (LPSTR)pszUserName, &sid, &cbSid, NULL, &cchReferencedDomainName, &sidNameUse))
...

你在调试器中运行过吗?崩溃是什么?顺便说一句,因为您将用户名作为输入参数传递,所以不需要调用GetBuffer。直接传递userName,让编译器使用到LPCTSTR的隐式转换。不确定为什么要强制转换为LPSTR(char*),因为该函数采用LPCTSTR(const TCHAR*)。不过,与原始问题无关,请查看TCHAR和LPSTR的用法。你把TCHAR*投给LPSTR是不好的。此外,LookupAccountName希望收到LPCTSTR。感谢您的建议。我将不得不更加密切地关注这样的事情。IDK为什么我要使用get buffer…还要注意文档中说“如果[ReferenceDomainName参数]为NULL,则函数返回所需的缓冲区大小。”,我不确定这是否符合您的预期——它可能只是查找您需要分配的缓冲区的大小,而不是填充SID。@尼克-您是对的,我没有正确使用它。我应该更注意API文档…刚才也遇到了这个,绝对不清楚的文档。“参数”通常非常明确,但在本例中,它实际上意味着“参数的取消引用值”