下面我自己给顺一边,问题也提出来,看看我理解的对不对,问题请高手帮我解释!
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)\\为什么\\lpReserved参数要给取消?
{
    if (dwReason == DLL_PROCESS_ATTACH)\\判断是否连接上了DLL进程
    {
 
  char pszLoader[MAX_PATH];
  char * pLowStr;
  GetModuleFileName(NULL, pszLoader, MAX_PATH);\\请问:这句的含义是什么?\\         我                查过帮助了,但还是有点不理解。
  pLowStr=CharLower(pszLoader);\\把字母全部小写
  if (strstr(pLowStr, "explorer.exe")!=NULL)\\比较pLowStr是否是\\                                                           explorer.exe 如果是返回FALSE
return FALSE; 
                  HANDLE hMutex=CreateMutex(NULL,TRUE,"IEXPLORE"); \\创建互斥,但这里我不知\\道创建和谁的互斥,是和IEXPLORE的互斥吗?CreateMutex()第二个函数TRUE的含义是什么?
if(hMutex==NULL||GetLastError() == ERROR_ALREADY_EXISTS)\\判断上句创建是\\否成功,如果没有成功,执行大括号里面的语句。 

//    程序已经运行
CloseHandle(hMutex); 
return FALSE; 

请问各位高手上面这段程序我的解释基本合理吗?我还有很多的不明白的地方,恳求各位的帮助,不明白的地方也已经写在上面了。就是下面这段程序,不明白的地方我标在最后面,高手们指点!
STDAPI DllCanUnloadNow(void)
{
    return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
}
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    return _Module.GetClassObject(rclsid, riid, ppv);
}
STDAPI DllRegisterServer(void)
{
    return _Module.RegisterServer(TRUE);
}
STDAPI DllUnregisterServer(void)
{
    return _Module.UnregisterServer(TRUE);
}晴问:STDAPI的定义是什么东西?这些都是自定义的函数吗?如果是的话,为什么没有函数内容,只有一个返回?返回的东西事什么?_Module.代表了什么,这里每个函数的用了很多,是个不经常使用的函数吗?请教!

解决方案 »

  1.   

    GetModuleFileName得到当前应用程序路径标准的输出函数用STDAPI宏声明
    如: 
    STDAPI DllRegisterServer() 
    STDAPI包括返回类型和调用规范。要注意STDAPI不能和__declspec(dllexport)一起使用, 
    因为STDAPI的扩展。输出必须使用.DEF文件。
      

  2.   

    GetModuleFileName(NULL,返回加载此DLL的EXE的文件名。
      

  3.   

    \\创建互斥,但这里我不知\\道创建和谁的互斥,是和IEXPLORE的互斥吗?CreateMutex()第二个函数TRUE的含义是什么?
    当然是为了被多次加载。
      

  4.   

    GetModuleFileName取得模块名。
    CreateMutex是创建互斥量,目的是为防止程序多重运行。
    其中,"IEXPLORE"是一个字符标记,当下次程序创建时,会和先前建立的互斥量的字符标记比较,如果相同,那么表示探测到了互斥,从而可以有效阻止程序再次被启动。 在这里目的是为防止该DLL被多次加载。