C++ 作为受限用户运行时,为什么我会在DLLMain中获得GPF?
为什么这段代码在作为受限用户运行时崩溃,而不是作为机器管理员运行时崩溃C++ 作为受限用户运行时,为什么我会在DLLMain中获得GPF?,c++,com,activex,atl,C++,Com,Activex,Atl,为什么这段代码在作为受限用户运行时崩溃,而不是作为机器管理员运行时崩溃 extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { hInstance; m_hInstance=hInstance; return _AtlModule.DllMai
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance,
DWORD dwReason,
LPVOID lpReserved)
{
hInstance;
m_hInstance=hInstance;
return _AtlModule.DllMain(dwReason, lpReserved);
}
代码在返回时崩溃。。。我不知道为什么
我得到:
The instruction at "0x7c90100b" referenced memory at "0x00000034".
The memory could not be "read".
此外,_AtlModule.DLLMain看起来像这样:
inline BOOL WINAPI CAtlDllModuleT<T>::DllMain(DWORD dwReason, LPVOID lpReserved) throw()
{
#if !defined(_ATL_NATIVE_INITIALIZATION)
dwReason; lpReserved;
#pragma warning(push)
#pragma warning(disable:4483)
using namespace __identifier("<AtlImplementationDetails>");
#pragma warning(pop)
if (dwReason == DLL_PROCESS_ATTACH)
{
ATLASSERT(DllModuleInitialized == false);
}
return TRUE;
#else
return _DllMain(dwReason, lpReserved);
#endif
}
inline BOOL WINAPI CAtlDllModuleT::DllMain(DWORD dwReason,LPVOID lpReserved)throw()
{
#if!已定义(_ATL_NATIVE_初始化)
原因;保留;
#pragma警告(推送)
#杂注警告(禁用:4483)
使用名称空间_标识符(“”);
#布拉格警告(pop)
if(dwReason==DLL\u进程\u附加)
{
ATLASSERT(DllModuleInitialized==false);
}
返回TRUE;
#否则
返回主(dwReason,lpReserved);
#恩迪夫
}
我们正在导入ATL DLL,并尝试静态链接。。。不走运
更新 使用ProcMon,我在这里得到一个缓冲区溢出: RegQueryValue HKU\S-1-5-21-448539723-854245398-195794488-1005\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Cache 缓冲区溢出 长度:144
这是什么意思?你没有真正说出“崩溃”是什么意思,所以很难说清楚。代码没有执行任何会导致崩溃的操作,因此对ATL模块的调用可能需要管理员权限,并因此而失败。 你在哪里申报中国?在德莱曼上空是静止的吗?只是尝试获取有关代码的更多详细信息。尝试运行,看看是否可以发现差异。您必须打开过滤功能,否则可能会有太多的输出无法通过
检查是否使用ATL DLL(而不是静态库)的一件事是:确保在这两种情况下都使用相同版本的DLL。当您收到一个错误,说您无法在某个0x0000处引用内存时。。。位置,它通常意味着您的代码试图引用某个对象的成员变量,但对象指针指向NULL。在本例中,成员变量是对象中的0x34字节。进一步猜测,假设它只在受限制的用户下运行时失败,我会说一些应该返回指向对象的指针的操作由于权限不足而失败。如果未测试返回的指针是否为null,则代码将继续运行,直到有人尝试读取其成员变量之一,此时您将发生崩溃
我要做的是彻底调试代码并查找可疑的空值。此外,您可能希望在启用LuaPriv测试的情况下运行应用程序。如果我的猜测是正确的,那么会报告一些API调用失败,在代码中显示为返回null。AppVerifier还应该为您提供堆栈跟踪,以便您能够轻松找到问题的根源。看起来我们跟踪了RDCOMClient,它用于在R中运行COM对象
每个人的回答都有帮助。谢谢。为什么打电话给DllMain需要管理员权限?崩溃。。。我收到一个“指令在Y处作为X引用内存。内存无法读取”错误。您是否尝试使用调试器单步执行调用?也许你有某种缓冲区溢出,用垃圾覆盖堆栈上的返回地址。DLL不是第一件要运行的事情吗?我在哪能把这堆东西搞砸?我应该去别的地方看看吗?对_AtlModule.DllMain(dwReason,lpReserved)的调用是什么;做什么?也许这会破坏stackI添加了_AtlModule.DLLMain的代码。。。但我不确定我是否理解在德尔曼上面声明。。。HINSTANCE m_HINSTANCE;Jason,_AtlModule.DllMain()在生成基于ATL的.DLL项目时被注入到DllMain.cpp文件中。这个项目不是以ATL项目的形式开始的吗?我想是的(它是旧的,继承的),但它被改变了。DllMain.cpp被重命名,因此我希望其他代码也能被修改。_AtlModule.DllMain函数在上面,我认为它是标准的。我认为它没有改变。此外,当你是一名管理员时,这是有效的,但当你受到限制时,这是无效的。。。这对我来说是最奇怪的事。不同的库对受限用户不可用吗?谢谢你的想法。。。我们将尝试。我们正在导入。。。但也尝试了静态库。没什么区别。你试过ProcMon了吗?它可以显示由权限问题等导致的故障。代码在_AtlModule.DllMain()之后崩溃。。。但在它回来之前。。。所以,是的,一定是早些时候发生了什么,导致了问题。我很难弄清楚如何使用ProcMon,我是新手。我们发现了缓冲区溢出,我把它放在正文中。。。现在怎么办?:)RegQueryValue错误可能是一种误导。它可能是两个调用中的第一个,第三个参数为NULL。这样做是为了获得所需的缓冲区大小。如果您看到一个成功的调用,您可能会忽略这个错误。此外,ProcMon将向您显示报告IIRC的堆栈跟踪。尝试使用调试器到达那里,看看发生了什么。