小编tde*_*may的帖子

卸载注入的DLL

我有一个DLL我注入其他进程使用SetWindowsHookEx.在DLL内部,我通过调用增加模块的引用计数器,GetModuleHandleEx这样我可以控制何时卸载模块.

此时,这两个API调用的模块引用计数"应为"2.当调用进程关闭时,它会调用UnhookWindowsHookEx,将引用计数减少到1. DLL有一个等待一些东西的线程,其中一个是调用进程的句柄SetWindowsHookEx.当进程消失时,DLL会进行一些清理,终止所有线程,清理内存和句柄然后调用FreeLibraryAndExitThread.这会减少计数器并卸载DLL.

这是我的问题.有一些进程,尤其是没有UI的进程,DLL永远不会被卸载.我很自信我清理了一切.而且我知道我的线程都没有运行.

首先,如果您有任何疑难解答提示以帮助发现原因,那将会有所帮助.否则,我正在考虑使用一些API NtQueryInformationProcess来获取模块地址并确认模块句柄计数实际上为零,然后调用CreateRemoteThread注入一个调用来LdrUnloadDll从进程内卸载模块地址.你对这种方法有什么看法?有没有人有任何示例代码?我很难找到如何获得模块句柄计数.

c++ dll-injection setwindowshookex unhookwindowshookex

4
推荐指数
2
解决办法
2789
查看次数

VSTO Word发布保存事件

很抱歉,我在过去曾要求我提供在问这类问题时尝试过的所有内容。

我正在编写Word加载项,需要对使用Word对象模型无法实现的文档进行更改。因此,将文档保存到磁盘后,我需要捕获该事件,关闭文件,执行所需的操作然后重新打开它。(我知道,这不是优雅的方法,但这就是我必须使用的方法。)

Word具有“保存前”和“关闭前”,但没有“保存后”事件。我通过创建另一个线程并使用COM的IMessageFilter(不是来自System.Windows.Forms)来处理COM Retry调用,或者在主线程上发回消息,以便在保存后执行代码,从而在线模拟了保存后事件的技巧。但这是行不通的,因为如果由于用户尝试关闭文档而导致文件被保存,则我的“回调”方法将无法获得文件名,因为Word.Document对象已被删除。

因此,我尝试在BeforeSave事件处理程序中显式调用Save self并返回Cancel = true。当用户选择保存或曾经保存到磁盘时,这种方法非常有用。但是,如果用户在不保存的情况下关闭了新文档,然后对是否要保存选择了“是”,则在从BeforeSave事件返回后,即使在处理完保存后,Word也会显示另一个“另存为”对话框,即使我在BeforeSave事件处理程序中设置Cancel = true。

因此,我尝试使用BeforeClose事件进行类似的操作。我处理关闭并保存自己,然后从事件处理程序返回Cancel = true。但是这样做会阻止用户尝试关闭应用程序时试图关闭多个文档。

我什至尝试处理WM_CLOSE,但这会导致上述类似问题。

谁能提供解决方案?

c# events multithreading vsto

3
推荐指数
1
解决办法
1487
查看次数

编组变量参数 - __arglist或替代

描述我试图解决的问题的最好方法是用代码说话.我在这个论坛上看到了很多__arglist问题,但没有很多有用的答案.我知道应该避免使用_arglist,所以我对其他方法持开放态度

在一个C++模块中,我有类似以下内容

void SomeFunction(LPCWSTR pszFormat, va_args args)
{
    // this function is not exported...
    // it is designed to take a format specifier and a list of variable 
    // arguments and "printf" it into a buffer. This code 
    // allocates buffer and uses _vsnwprintf_s to format the 
    // string. 
    // I really do not have much flexibility to rewrite this function
    // so please steer away from scrutinizing this. it is what is 
    // and I need to call it …
Run Code Online (Sandbox Code Playgroud)

c# c++ pinvoke marshalling variadic-functions

1
推荐指数
1
解决办法
2668
查看次数

.NET GC删除正在使用的对象

我遇到了一个问题,它会出现GC线程正在唤醒并删除正在使用的对象.

当processfoo正在运行时,在它返回之前,它会出现fooCopy析构函数在一个单独的线程中触发.有没有人看到这样的问题,如果是这样,你如何解决它?当然,这不可能真的发生,我必须做错事.谁能给我一些调试垃圾收集的提示/策略?

try
{
    CFoo fooCopy = new CFoo(someFoo);
    someBar.ProcessFoo(fooCopy);
}
Run Code Online (Sandbox Code Playgroud)

CFoo有一个IntPtr成员变量.ProcessFoo将该成员变量传递给C++ DLL中的导入函数,该函数可能需要几秒钟才能运行.

在我的C++ DLL中,我在创建IntPtr时以及删除它时记录,我可以在ProcessFoo运行时看到一个单独的线程删除IntPtr.

c# garbage-collection

1
推荐指数
1
解决办法
274
查看次数