共享一些信息,将所有DLL拉入进程

我们有一个有很多进程的企业系统(EXE,服务,DCOM服务器,COM +应用程序,ISAPI,MMCpipe理单元),所有这些都使用了许多COM组件。 我们最近在某些客户部署中看到了失败,但却发现很难排除原因。

为了追踪这个问题,我们用错误发生的日志语句来扩充整个源代码。

为了确定哪些日志来自哪些进程,C ++日志logging代码(编译到所有组件)使用EXE名称来命名日志。 这对于某些情况非常有用,但不是所有的 – COM +应用程序,ISAPI和MMCpipe理单元都具有系统EXE名称,并且日志以交错方式结束。

我看到这篇关于共享数据部分的post可能有帮助,但我不明白的是谁决定共享部分中的内容。 有什么方法可以保证在别人读取之前,一段特定的代码写入共享部分?

还是有更好的解决这个问题?

要同步写入共享部分的多个进程,您需要某种类型的IPC,例如Windows事件,互斥锁,套接字。 每个模块都调用CreateMutex并传递所有模块共享的固定名称。 模块然后调用WaitForSingleObject等待并声明互斥锁 – 当其中一个获取它时,它可以在每个其他模块等待时读取/写入共享部分。 完成后,调用ReleaseMutex让另一个模块出去。

说完所有这一切,我会坚持日志文件。 我猜你的问题是,DLL的基础上,你的日志文件名父级进程EXE名称,而不是DLL自己的名字?

您可以通过存储在DllMain中传递的DLL实例句柄,然后将其与GetmoduleeFileName一起使用来获取DLL自己的名称。 注意这适用于EXE以及如果您将实例句柄保留为NULL。

// global variable to store DLL handle (or it stays NULL if this is an EXE) HINSTANCE hDllHandle=NULL; BOOLEAN WINAPI DllMain( IN HINSTANCE hInstance, IN DWORD nReason, IN LPVOID Reserved ) { hDllHandle = hInstance; return TRUE; } <snip> void Log(LPSTR lpszMsg) { WCHAR szMymoduleeName[MAX_PATH]={0}; // if hDllHandle is still NULL (eg this is an EXE) it returns the process name // if non-NULL, it returns our DLL name GetmoduleeFileName(hDllHandle, szMymoduleeName, MAX_PATH); fprintf(LOGFILE, "[%s] %s\n", szMymoduleeName, lpszMsg); ....<snip>.... } 

在DLL中使用共享部分(带有RWS标志的部分)并不能真正解决您的主要问题。 如果您需要共享内存以便在进程之间进行快速通信,则可以使用内存映射文件(例如,请参阅http://msdn.microsoft.com/en-us/library/ms810613.aspx ),并对创建和使用共享内存。

要获得更多关于加载DLL的过程,可以另外记录应用程序的命令行GetCommandLine()例如GetCommandLine()函数)。 您将看到“C:\ Windows \ system32 \ mmc.exe C:\ Windows \ system32 \ services.msc”或“C:\ Windows \ system32 \ mmc.exe C:\ Windows \ system32 \ azman.msc”为MMC管理单元。

要查看有关调用过程的更多信息,请参阅StackWalk64 (请参阅http://msdn.microsoft.com/zh-cn/library/ms680650(VS.85).aspx )函数。 请参阅http://stackwalker.codeplex.com/或http://www.codeproject.com/KB/threads/StackWalker.aspx,获取一个很好的代码示例&#x3002;