模块与进程之间是什么关系?

hztj2005 2012-12-13 11:29:22
MFC程序初始化中会调用基类CWinApp::CWinApp的构造函数,其中有:
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
这应该是获取一个指向模块的指针。

我想请教的是模块、进程、实例之间的关系。

一个应用程序可以启动多个实例,每个实例应该是单独的进程,似乎也应该是单独的模块,那模块与进程之间是什么关系,装载运行的那个环节建立模块数据,又保存在哪里,与操作系统会为进程建立一个object,与模块又什么关系?

CWinApp::CWinApp(LPCTSTR lpszAppName)
{
if (lpszAppName != NULL)
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;

// initialize CWinThread state
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
ENSURE(pModuleState);
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ENSURE(pThreadState);
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId();

// initialize CWinApp state
ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
pModuleState->m_pCurrentWinApp = this;
ASSERT(AfxGetApp() == this);

.......
m_nSafetyPoolSize = 512; // default size
}
...全文
705 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
潇潇雨云 2012-12-14
  • 打赏
  • 举报
回复
学习
快乐鹦鹉 2012-12-13
  • 打赏
  • 举报
回复
前任大版liyiling的回复: 对win32操作系统环境:一个进程代表一个正在运行的应用程序,或说,代表一个应用程序的实例,而一个线程代表进程里代码的一条执行线路。进程本身是惰性而不执行任何代码的,每个进程至少有一个主线程,由主线程在进程的环境里执行代码。当然,也可以有多个线程。在win32下,进程与模块没有区别。
hztj2005 2012-12-13
  • 打赏
  • 举报
回复
找了个枚举线程模块的代码,可以运行时老是stack溢出,不知为什么。
sdchenchen2012 2012-12-13
  • 打赏
  • 举报
回复
这里的模块我也没搞清楚 四种状态: 模块 进程 线程 模块---线程
Eleven 2012-12-13
  • 打赏
  • 举报
回复
引用 6 楼 hztj2005 的回复:
http://bbs.csdn.net/topics/290020320 有这么些文字: 一个模块代表的是一个运行中的exe文件或者dll文件 用来代表这个文件中的所有代码和资源, 磁盘上的文件不是模块,载入内存后运行时就叫做模块. 一个应用程序调用其他dll中的api时,这些dll文件被装入内存, 就产生了不同的模块. 为了区分地址空间中的不同模块 每个模块都有一个唯一的模块句柄来标识……
看看,写的不错~
hztj2005 2012-12-13
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/290020320 有这么些文字: 一个模块代表的是一个运行中的exe文件或者dll文件 用来代表这个文件中的所有代码和资源, 磁盘上的文件不是模块,载入内存后运行时就叫做模块. 一个应用程序调用其他dll中的api时,这些dll文件被装入内存, 就产生了不同的模块. 为了区分地址空间中的不同模块 每个模块都有一个唯一的模块句柄来标识。 模块是指EXE和DLL等程序模块,程序模块加载后,其开始地址就是该模块的句柄值;进程是系统中运行的应用程序,进程句柄中储存用于访问该进程的一些信息,句柄值是一个索引值,通过该索引可以访问句柄中的内容。 一个进程里有N个模块,模块句柄就是模块在进程中的首址,0x80000000以下的地址都有可能是模块句柄。 进程句柄是由操作系统来维护的,属于内核对象,不是一个具体的地址。可以用CreateProcess或OpenProcess来获得进程句柄,同理线程句柄也是这样。 一般进程都是由多个模块组成的,通常应用程序都是通过模块句柄来访问进程中的模块.事实上,模块句柄的值就是该模块映射到进程中的地址 进程句柄是用来标识一个进程的,在调用进程相关函数的时候,就得用上这个进程句柄,在应用程序中要用的时候起到一个标识的作用,说到底其实也就是一个索引号码,就是告诉操作系统,嘿大哥,我要操作一个标识是XX的进程,然后操作系统的对象管理器通过这个XX找到这个进程实际的进程数据结构的地址,然后进行相关操作,比如可以返回这个进程已经运行的时间,这个进程的优先级,这个进程加载的基地址等等。 那么这个实例句柄是什么呢,就是上面说的进程加载的基地址:进程加载到虚拟内存地址空间的地址,一般的进程的实例句柄的值是:0x00400000,作用很到,像GetModuleHandle(NULL)函数就是会返回这个基地址的,比如用来加载icon:LoadIcon(实例句柄,IDI_xxx)。 实例句柄和进程句柄的值,完全不同。要加载一些资源的时候就会用实例句柄,比如:加载位图,加载图标等;而要获取一些进程的信息,对进程进行一些操作的时候,比如:结束进程,对其他进程进行远程注入线程等等。
oyljerry 2012-12-13
  • 打赏
  • 举报
回复
关键还是要看模块的定义范围,可以跟进程一样类似,也可以进程里面包含多个独立的模块,比如dll
ok1234567 2012-12-13
  • 打赏
  • 举报
回复
模块分为进程内和进程外两种类型 前者共享进程空间,比如许多在进程中加载的dll 后者与进程一样,独立运行,通常供其它进程调用(由引用计数之类的管理)
hztj2005 2012-12-13
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
前任大版liyiling的回复: 对win32操作系统环境:一个进程代表一个正在运行的应用程序,或说,代表一个应用程序的实例,而一个线程代表进程里代码的一条执行线路。进程本身是惰性而不执行任何代码的,每个进程至少有一个主线程,由主线程在进程的环境里执行代码。当然,也可以有多个线程。在win32下,进程与模块没有区别。
线程与进程的关系,我了解。 在win32下,进程与模块没有区别,但是看下面的模块状态代码,好像与进程数据不同:

// AFX_MODULE_STATE (global data for a module)
class AFX_MODULE_STATE : public CNoTrackObject
{
public:
#ifdef _AFXDLL
	AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc, DWORD dwVersion,
		BOOL bSystem = FALSE);
#else
	explicit AFX_MODULE_STATE(BOOL bDLL);
#endif
	~AFX_MODULE_STATE();

	CWinApp* m_pCurrentWinApp;
	HINSTANCE m_hCurrentInstanceHandle;
	HINSTANCE m_hCurrentResourceHandle;
	LPCTSTR m_lpszCurrentAppName;
	BYTE m_bDLL;    // TRUE if module is a DLL, FALSE if it is an EXE
	BYTE m_bSystem; // TRUE if module is a "system" module, FALSE if not
	BYTE m_bReserved[2]; // padding

	DWORD m_fRegisteredClasses; // flags for registered window classes

	// runtime class data
#ifdef _AFXDLL
	CRuntimeClass* m_pClassInit;
#endif
	CTypedSimpleList<CRuntimeClass*> m_classList;

	// OLE object factories
#ifndef _AFX_NO_OLE_SUPPORT
#ifdef _AFXDLL
	COleObjectFactory* m_pFactoryInit;
#endif
	CTypedSimpleList<COleObjectFactory*> m_factoryList;
#endif
	// number of locked OLE objects
	long m_nObjectCount;
	BOOL m_bUserCtrl;

	// AfxRegisterClass and AfxRegisterWndClass data

	CString m_strUnregisterList;

#ifdef _AFXDLL
	WNDPROC m_pfnAfxWndProc;
	DWORD m_dwVersion;  // version that module linked against
#endif

	// variables related to a given process in a module
	//  (used to be AFX_MODULE_PROCESS_STATE)
	void (PASCAL *m_pfnFilterToolTipMessage)(MSG*, CWnd*);

#ifdef _AFXDLL
	// CDynLinkLibrary objects (for resource chain)
	CTypedSimpleList<CDynLinkLibrary*> m_libraryList;

	// special case for MFCXXLLL.DLL (localized MFC resources)
	HINSTANCE m_appLangDLL;
#endif

#ifndef _AFX_NO_OCC_SUPPORT
	// OLE control container manager
	COccManager* m_pOccManager;
	// locked OLE controls
	CTypedSimpleList<COleControlLock*> m_lockList;
#endif

#ifndef _AFX_NO_DAO_SUPPORT
	_AFX_DAO_STATE* m_pDaoState;
#endif

#ifndef _AFX_NO_OLE_SUPPORT
	// Type library caches
	CTypeLibCache m_typeLibCache;
	CTypeLibCacheMap* m_pTypeLibCacheMap;
#endif

	// define thread local portions of module state
	CThreadLocal<AFX_MODULE_THREAD_STATE> m_thread;

	//Fusion: declare pointer to array of pointers to isolation aware dll wrappers (ex: comctl32).
	CDllIsolationWrapperBase** m_pDllIsolationWrappers;
	//Defaults to TRUE. When FALSE - MFC will not activate context in AFX_MAINTAIN_STATE2 (used by AFX_MANAGE_STATE).
	BOOL	m_bSetAmbientActCtx;
	//Handle of the module context.
	HANDLE	m_hActCtx;
	void CreateActivationContext();

	// bool indicating the return value of InitNetworkAddressControl() (from shell32.dll) 
	BOOL m_bInitNetworkAddressControl;
	// bool indicating whether or not InitNetworkAddressControl() (from shell32.dll) have been called for CNetAddressCtrl
	BOOL m_bInitNetworkAddressControlCalled;
};

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧