***如何动态调用多个DLL?高手请进........(100分)

  • 主题发起人 主题发起人 江远
  • 开始时间 开始时间

江远

Unregistered / Unconfirmed
GUEST, unregistred user!
程序中需要调用多个DLL,这些DLL的函数名,参数个数,类型等都保存在一个数据库中<br>请问如何动态调用多个DLL?<br><br>请注意这些DLL中可能需要传递一些参数,比如Init函数返回一个指针,供后面的函数如Connect函数调用
 
关注 ,学习。在数据库中。希望知道怎么定义。
 
的确参数的定义很难,我初步是这样设想的,每个函数定义10个参数,然后按记录调用<br>比较难!
 
那你定义dll函数的时候怎么定义?你是把函数名称放在数据库的。
 
用动态调用不是很好解决吗,<br>还是我没看明白你的意思
 
看看有帮助没<br>funcPiiRi = function (a, b: Integer): Integer;<br><br>procedure TForm1.btn1Click(Sender: TObject);<br>var<br> &nbsp;hInstDll: HINST;<br> &nbsp;foo: funcPiiRi;<br> &nbsp;sDllName, sFuncName: PChar;<br>begin<br> &nbsp;sDllName := 'func.dll';<br> &nbsp;sFuncName := 'getMax';<br> &nbsp;hInstDll := LoadLibrary(sDllName);<br> &nbsp;foo := GetProcAddress(hInstDll, sFuncName);<br> &nbsp;Caption := IntToStr(foo(1, 2));<br> &nbsp;FreeLibrary(hInstDll);<br>end;
 
谢谢daWolf,谢谢各位!<br>我还是把我想做的事介绍一下下吧<br>我想做一个通用测试系统,主要是针对硬件测试.<br>系统中有许多板卡,这些板卡不是固定的,可以添加和删除,每个板卡有自己的驱动,<br>所以需要动态调用DLL<br><br>当然也有好的方面。这些DLL都是自己写的,函数定义方面可以根据需要来设定<br>因为原始驱动一般是用C写的,所以我先用VC把它封装成DLL,然后在<br>DELPHI中调用。用VC做界面太难看了,CVI又有许多方面不支持。<br><br>欢迎用DELPHI开发硬件测试系统的朋友一起交流一下!
 
funcPiiRi = function (a, b: Integer): Integer; //这里的参数从数据库取出来应该怎么定义?这样的想法可以实现?<br><br>procedure TForm1.btn1Click(Sender: TObject);<br>var<br> &nbsp;hInstDll: HINST;<br> &nbsp;foo: funcPiiRi;<br> &nbsp;sDllName, sFuncName: PChar;<br>begin<br> &nbsp;sDllName := 'func.dll';<br> &nbsp;sFuncName := 'getMax';<br> &nbsp;hInstDll := LoadLibrary(sDllName);<br> &nbsp;foo := GetProcAddress(hInstDll, sFuncName);<br> &nbsp;Caption := IntToStr(foo(1, 2));<br> &nbsp;FreeLibrary(hInstDll);<br>end;
 
试着换了一下,用Varaint。这样虽然可以不用考虑参数个数和类型,但是不知道C里面是否可以这样用<br>硬件方面的完全不懂的说(C还好点,十窍通九……)<br>funcType = function (paramList: array of Variant): Variant;<br>procedure TForm1.btn2Click(Sender: TObject);<br>var<br> &nbsp;hInstance: HINST;<br> &nbsp;funcChar, funcInt: funcType;<br>begin<br> &nbsp;hInstance := LoadLibrary('dlla.dll');<br> &nbsp;funcChar := GetProcAddress(hInstance, 'maxChar');<br> &nbsp;funcInt := GetProcAddress(hInstance, 'maxInt');<br> &nbsp;ShowMessage(funcChar(['1', '2', funcInt([1, 2, 4])]));<br> &nbsp;FreeLibrary(hInstance);<br>end;<br>dllA------------------------------------------<br>function maxInt(intList: array of Variant): Variant;<br>var i: Integer;<br>begin<br> &nbsp;Result := intList[Low(intList)];<br> &nbsp;for i := Low(intList) to High(intList) do Result := Max(intList, Result);<br>end;<br><br>function maxChar(charList: array of Variant): Variant;<br>var iMin, iMax, i: Integer;<br>begin<br> &nbsp;iMin := Low(charList); iMax := High(charList); Result := charList[iMin];<br> &nbsp;for i := iMin + 1 to iMax do if charList &gt; Result then Result := charList;<br>end;
 
谢谢daWolf,你的思路和我想的比较接近,搞一个动态的Variant数组做参数.
 
后退
顶部