【问题标题】:exception thrown from a Win32 call on XPXP 上 Win32 调用引发的异常
【发布时间】:2011-04-20 21:05:51
【问题描述】:

全部,

我有一台 XP SP3 机器,它仅在使用我的软件时在家里运行、无线连接但没有域控制器或任何东西时崩溃。

我得到以下转储

Call stack below ---
 # ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
00 0337ddc8 77e9f942 000006ba 00000001 00000000 kernel32!RaiseException+0x52
01 0337dde0 77e9fc30 000006ba 0337e1f4 0337e1d8 RPCRT4!RpcRaiseException+0x34
02 0337ddf0 77ef560b 0337de3c 0000004c 00217d40 RPCRT4!RpcRaiseException+0x322
03 0337e1d8 77de1ee8 77ddf4b0 77de14e4 0337e1f4 RPCRT4!NdrClientCall2+0x13b
04 0337e1ec 77de1e6a 00209878 0337e260 00000800 ADVAPI32!LsaOpenPolicy+0xc1
05 0337e240 77de5be7 0337e28c 0337e260 00000800 ADVAPI32!LsaOpenPolicy+0x43
06 0337e2a8 77de5b7a 015246d0 0337e930 0337e3f0 ADVAPI32!LookupAccountNameW+0x8e
07 0337e2d0 10006903 015246d0 0337e930 0337e3f0 ADVAPI32!LookupAccountNameW+0x21

我怀疑的代码是

char aTmp[MAX_PATH];
DWORD dwSize=sizeof(aTmp);
SID_NAME_USE aTmp2;
unsigned short usDmn[MAX_PATH];
DWORD dwDmn=sizeof(usDmn);

wchar_t* pDomain;
if (!rDomain.empty())
    pDomain=(wchar_t*)rDomain.c_str();
else
    pDomain=NULL;

if (!LookupAccountNameW(pDomain, (wchar_t*)rUser.c_str(), (PSID)aTmp,
                        &dwSize,
                        (LPWSTR)usDmn,
                        &dwDmn,
                        &aTmp2))
    //Error
    return aInfo;

user 和 domain 是传入的字符串变量...

我遗漏了什么明显的东西吗?抛出了什么异常?enter code here

【问题讨论】:

  • 为什么你对参数 3 使用 char 数组而不是 SID 结构?在您的用例中 pDomain NULL 与否?另外,您需要 SID 还是 SID_NAME_USE?如果你不这样做,你可以传入 NULL。
  • 来自 MSDN:Sid [out, optional] 一个指向缓冲区的指针,该缓冲区接收与 lpAccountName 参数指向的帐户名称相对应的 SID 结构。如果此参数为 NULL,则 cbSid 必须为零。
  • 重新发布此代码将删除所有演员表。
  • 我知道那个参数的作用;我不知道您为什么不分配 SID 结构并将其地址传递进去,或者如果您不需要它则发送 NULL。您正在发送一个没有任何意义的 char 数组。
  • 抛开其他观察,dwDmn 看起来很可疑。您以字节为单位传递大小,而函数需要以字符为单位的大小。

标签: c++ winapi exception


【解决方案1】:

你施放的任何地方都可能是一个错误。你没有向我们展示所有的定义,但你正在铸造的事实表明有些事情是错误的。您似乎将 ANSI 参数传递给 Unicode 函数。

你为什么使用无符号 短而不是宽字符?

您的 SID 看起来也完全错误。

【讨论】:

    【解决方案2】:

    rUser 的类型是string 而不是wstring,假设您需要在对.c_str() 的调用中添加(wchar_t*) 强制转换以使编译器不会抱怨。

    同样,rDomain 也可能是 8 位 string 类型,而不是 16 位 wstring 类型。

    【讨论】:

    • 很抱歉域和用户是 wstring 而不是 string
    • @reza:那你为什么要转换 rUser.c_str() 的结果?
    • 我正在将 wstring 转换为 wchar_t*
    • @reza:铸造没有转换。你确定它正在做你认为的那样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2019-01-22
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2020-04-28
    • 2020-11-07
    相关资源
    最近更新 更多