Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 作为受限用户运行时,为什么我会在DLLMain中获得GPF?_C++_Com_Activex_Atl - Fatal编程技术网

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的堆栈跟踪。尝试使用调试器到达那里,看看发生了什么。