各位知不知道有没有如下的技术方案,一个DLL中的函数在被一个EXE或DLL调用时,怎么才能记录下来是那个程序在调用它,参数是如何传递的。如果哪位高手知道具体的内容,请回复,十分感谢。

解决方案 »

  1.   

    DLL有一个入口函数DllMain,Windows在库装载、卸载、进程中线程的创建和结束都会调用这个入口函数。BOOL APIENTRY DllMain(HANDLE hModule, DWORD rl_reason_for_call, LPVOID lpReserved)
    {
       case (ul_reason_for_call)
       {
          //DLL被映射
          case DLL_PROCESS_ATTACH:
          //Dll线程启动
          case DLL_THREAD_ATTACH:
          //Dll线程销毁
          case DLL_THREAD_DETACH:
          //Dll被卸载
          case DLL_PROCESS_DETACH:
            break;
       }
       return TRUE;
    }其中:hModule表示Dll模块的实例句柄;
    在程序中我们通过调用GetModuleHandle(NULL)获得的句柄是调用者的句柄。
    可以通过调用者的句柄再去判断调用者的应用程序。以上使用C语言,对应Delphi中使用
    initialization
    finaliaztion
    end.
      

  2.   

    还有三个问题,请进一步指导:
    (1)DLLMain在delphi中好像一般情况下只有一个参数rl_reason_for_call,名称一般叫dwReason。好像没有hModule参数。
    (2)delphi在调用DllMain时,一般通过工程文件中写DllMain(DLL_PROCESS_ATTACH);方式实现,如果此时在DllMain中增加参数hModule后,这个值如何传递呢。
    (3)DLLMain中参数hModule的含义好像是自己的句柄,而不是调用窗口的句柄。
      

  3.   

    在dll中可以引用Forms单元,使用application对象取得应用程序的相关属性。
    如果要对起进行记录的话,可以在dll初始化的时候对其进行相关的记录。
      

  4.   

    GetModuleHandle(nil)可以直接获取了.不需要你去取得.
    2 在delphi的SysInit单元中有HInstance变量.他就是hModule,等于GetModuleHandle(nil)注意:application对象中没有hModule的描述
      

  5.   

    想了解你调用你DLL进程的信息
    有以下API可以提供帮助
    GetCurrentProcess  获取当前进程Handle
    GetCurrentProcessID  获取当前进程的进程ID
    GetCommandLine 获取启动当前进程时命令行, 其中包括进程的文件名称
    以上均为Windows API函数
      

  6.   

    我有新的思路,应为调用程序回把下一条地址压入堆栈,我们可以更据这条地址来判断该地址输入本进程的那一个部分
    分成两个部分。
    第一:如何获取调用程序下一条指令地址。
    在dll中导出过程,一进来的[esp]肯定就调用模块下一条地址值,但delphi过程封装时又处理了esp的值我写了这样的处理,供楼住参考。
    假设在dll中我有一导出过程 procedure ShowModuleName;stdcall;
    var
      CallAddress:PDWORD;
    begin
      asm
        pushad;  
        push   [esp+38h] //这里就是调用着下条指令的地址了。我是通过cpuview看esp栈算出来的。
        pop  CallAddress
        popad;
      end ;
      
    end;
      

  7.   

    接下来就是知道地址如何获得模块名了。这里就没上面简单了。
    在delphi下有一个 EnumerateLoadedModules,可以使用他..我的代码如下
    定义回调。我的声明如下参数为ModuleName,模块名,ModuleBase模块句柄,ModuleSize大小,
    function EnumLoadedModulesfarProc(ModuleName: PChar;ModuleBase: DWord;ModuleSize: DWord;UserContext: Pointer): LongBool; stdcall;使用EnumerateLoadedModules列举模块。CallAddress为我们上面获取的值
    EnumerateLoadedModules(GetCurrentProcess,@EnumLoadedModulesProc,nil);余下的事情就是判断地址值是否在某个模块下了,代码就略了!
      

  8.   

    检测调用该DLL的进程
    Application.ExeName
    GetCommandLine不知道如何确定是静态连接还是动态连接
      

  9.   

    我的程序是一个多线程共享程序,当一个DLL调用线程池DLL的时候,线程池DLL会给它分配一个线程,然后再运行。我想通过线程的一些相关信息得到调用的DLL的信息,不知道能否成功。
    现在还没有试出来。
      

  10.   

    EnumerateLoadedModules64函数返回的内容好像不能得到,我还在继续测试中。
    顶。
      

  11.   

    经过测试后,发现的确能够得到调用的主EXE的信息,但是不能得到中间DLL的信息。
      

  12.   

    我的程序中,是一个主exe程序,调用了多个dll程序,这些程序中,
      

  13.   

    我的程序中,是一个主EXE程序,调用了多个DLL程序,这些程序又调用了通用的文件
      

  14.   

    我的程序中,是一个主EXE程序,调用了多个DLL程序,这些程序又调用了通用的DLL文件,发现有的dll在调用dll时,会有问题,但是不能准确定位到哪一个dll文件的问题。现在得到了主exe信息,但是得不到DLL信息,还是不行啊。各位大侠,还有什么其它得办法呢?
      

  15.   

    CSDN的判断要求太严格了,一段话说了太多遍,才能上去,老说我伤害了它
      

  16.   

    关注 ……  DLL问题 求解中
      

  17.   

    其实非常之简单:
    delphi中
    GetModuleFileName(HInstance,lp,   100);
    就可得到自己dll的路径,其中HInstance为当前dll的Hmoudle