问题是这样的:
有很多类似的函数:
function InstanceMethod1(parameter1 : String ; parameter2:String ): String ;
function InstanceMethod2(parameter1 : String ; parameter2:String ): String ;
....
function InstanceMethodN(parameter1 : String ; parameter2:String ): String ;
(这些都是从DLL文件中导出的函数,参数个数,类型完全一样)现在想把这些函数整合归纳定义在一个函数中,然后通过某种标识能动态的调用这些函数。不知道有什么解决方法。意图:为了更方便的管理

解决方案 »

  1.   

    导出一个函数
    function InstanceMethod(mode:integer):String;stdcall;
    begin
        case n of
         1:instanceMethod1(...);
         2:......
    end;
      

  2.   

    我的想法是:最好通过这样的方式
    function DoInstanceMethod(strMethodName:String ; parameter1:string;parameter2:String) :string
    begin
       result := strMethodName(parameter1,parameter) ;
    end ;因为这个DLL文件中可能有数百个函数,如果像上面的方法,那样也很麻烦。
      

  3.   


    function InstanceMethod(funname:string;parameter1 : String ; parameter2:String ): String ; var pfun:function (parameter1 : String ; parameter2:String ): String ;Begin
      pFun:=GetProcAddress(dllhandle,FunName);
      result:=pFun(parameter1,parameter2);
    End;
      

  4.   

    同 xiaoxiao_8(小小_8) 的方法:
    function DoInstanceMethod(strMethodName: String; parameter1: string; parameter2: String):String;
    type
      TFunc = function (parameter1: String ; parameter2: String):String;Stdcall;
    var
      DllHandle: THandle;
      Method: TFunc;
    begin
      DllHandle := LoadLibrary('你的Dll.dll');
      try
        if DllHandle <> 0 then
          begin
            @Method := GetProcAddress(DllHandle, PAnsiChar(strMethodName));
            if Assigned(@Method) then
              Method(parameter1, parameter2);
          end
          else exit;
      finally
        FreeLibrary(DllHandle);
      end;
    end;
      

  5.   

    可以这样,不知道是不是理解了楼主的意思:
    首先声明函数类型type
      TDLLFunction = function (parameter1 : String ; parameter2:String ): String ;
      
    在定义的那个总结函数中
    var
      DllFunc:TDllFunction;
      
    begin
      首先LoadLibrary;
      Result:='';
     
      if 第一种情况 then
        DllFunc:=GetProcAddress(LibHandle,'InstanceMethod1') //LibHandle是DLL句柄
      else if 第二种情况 then
        DllFunc:=GetProcAddress(LibHandle,'InstanceMethod2')  ……
      else
        DllFunc:=GetProcAddress(LibHandle,'InstanceMethodN');  if not (@DllFunc=nil) then
        Result:=DllFunc(parameter1,parameter2);  最后FreeLibrary;
    end;不知道是不是这个意思?
      

  6.   

    晕倒,没看到,xiaoxiao_8(小小_8) 和hottey(孤独的探索者)(起步中)已经回帖了,就是这个意思
      

  7.   

    Thanks, 明早上我给各位大哥散分。今晚回家试试。谢谢你们。
      

  8.   

    注意:用string类型请在工程里加uses ShareMem,dll文件和exe文件都要加
      

  9.   

    对了,在DLL中最后用PChar来代替string类型以避免使用BorlandMM.dll,具体的信息可以参见DLL向导产生的大段注释
      

  10.   

    Thanks very much!谢谢大家。 结贴!