在DELPHI中如何调用下面的函数?(30分)

  • 主题发起人 主题发起人 speedaway
  • 开始时间 开始时间
S

speedaway

Unregistered / Unconfirmed
GUEST, unregistred user!
本人遇到一个难题,请教各位大虾:<br>BOOL WINAPI CryptAcquireContext(<br>&nbsp; HCRYPTPROV *phProv,<br>&nbsp; LPCTSTR pszContainer,<br>&nbsp; LPCTSTR pszProvider,<br>&nbsp; DWORD dwProvType,<br>&nbsp; DWORD dwFlags);<br>请问在DELPHI中如何调用呀。上面的函数在WINDOWS的ADVAPI32.dll中,<br>
 
要调用DLL函数,需要知道确切的语法,然后设置一个函数类型。比如,在下例中,调用MyTest.DLL里面的CallMe函数。此函数接受两个整数作为参数,返回一个字符串。<br><br><br>procedure TForm1.Button1Click(Sender: TObject); type TCallMeDll = function(a,b: Integer): string; var CallMeDll: TCallMeDll; FuncPtr: TFarProc; hDll: THandle; result: string; begin hDll:=LoadLibrary('Mytestdll.dll'); FuncPtr:=GetProcAddress(hDLL,'CallMe'); @CallMeDll:=FuncPtr; if @CallMeDll &lt;&gt; nil then result:=CallMeDll(4,5); FuncPtr:=nil; FreeLibrary(hDll);end;<br><br>&nbsp; &nbsp; &nbsp;注意,首先要把DLL装载到内存。然后获得指向函数的指针,并将其指派给CallMeDLL。检查ProcAddress
 
或者1. 所需动态连结的 DLL 须置放在与执行档同一目录或Windows System 目录<br>2. 确认 DLL export 出来的函式的原型, 以目前的情况而言, 通常只拿得到 C语言的函数原型,这时要注意 C 与 object Pascal 相对应的型别, 如果需要, 在interface 一节定义所需的资料类别<br>3. 在 implementation 节中宣告欲使用的函式, 语法大致如下:<br>procedure ProcName(Argu...); far; external 'DLL档名';<br>index n;<br>function FuncName(Argr...): DataType; far;<br>external 'DLL档名'; index n;<br>宣告时, index n 如果不写, 便是参考资料中所谓 import by name 的方式, 此时, 由於需要从 DLL 的 name table 中找出这个函式, 因此, 连结执行速度比import by ordinal稍慢一些, 此外, 还有一种 by new name, 由於我没用过, 您可以查一参考资料, 大意是可以 import 後改用另一个程式命名呼叫这个函式<br>4. 然後, 呼叫与使用就与一般的Delphi 没有两样<br>5. 上述是直接写到呼叫DLL函式的程式单元中, 此外,也可以将DLL的呼叫宣告集中到一个程式单元(Import unit), Delphi 内附的 WinTypes, WinProcs是一个例子,您可以参考一下,同时观察一下 C 与 Pascal 互相对应的资料型态<br>6. 除了上述的 static import 的方式, 另外有一种 dynamic import 的写法,先宣告一个程序类型(procedural-type),程式执行时, 以 LoadLibrary() API Load 进来後, 再以 GetProcAddress() API 取得函式的位址的方式来连结呼叫, 在Object Pascal Language Guide P.132-133 有一个例子, 您可以参考看看 <br>如果要举个例子, 以下是从我以前的程式节录出来的片断:<br>(* for CWindows 3.1 *)<br>unit Ime31;<br>interface<br>uses<br>SysUtils, WinTypes, WinProcs, Dialogs;<br>type<br>(* 必要的资料型态宣告 *)<br>tDateNTime = record<br>wYear, wMonth, wDay: word;<br>wHour, wMin, wSec: word;<br>end;<br>TImePro = record<br>hWndIme: HWnd; { IME handle }<br>dtInstDate: tDateNTime; { Date and time of installation }<br>wVersion: word; { the version of IME }<br>szDescription: array[0..49] of byte; { Description of IME module}<br>szName: array[0..79] of byte; { Module name of the IME }<br>szOptions: array[0..29] of byte; { options of IME at startup}<br>fEnable: boolean; { IME status; True=activated,False=deactivated }<br>end;<br>pTImePro = ^TImePro;<br>function SetIme(const sImeFileName: string): boolean; far;<br>implementation<br>(* begin 呼叫 winnls.dll export 函数的宣告 *)<br>function ImpSetIme(hWndIme: HWND; lpImePro: pTImePro): boolean;far; external 'winnls.dll';<br>(* end 呼叫 winnls.dll export 函数的宣告 *)<br>(* -------------------------------------------------- *)<br>(* SetIme(const sImeFileName: string): boolean;<br>(* ======<br>(* 切换到某一特定的输入法<br>(*<br>(* 传入引数:<br>(* sImeFileName: 输入法 IME 档名, 例: phon.ime;<br>(* 空字串: 英数输入法<br>(*<br>(* 传回值:<br>(* True: 切换成功<br>(* False: 失败<br>(* -------------------------------------------------- *)<br>function SetIme(const sImeFileName: string): boolean;<br>var<br>pImePro: pTImePro;<br>begin<br>Result := False;<br>if MaxAvail begin<br>MessageDlg('记忆体不足', mtWarning, [mbOk], 0);<br>Exit;<br>end<br>else<br>begin<br>New(pImePro);<br>try<br>if sImeFileName = ' then (* 空字串, 还原到英数输入法 *)<br>pImePro^.szName[0] := 0<br>else<br>StrPCopy(@pImePro^.szName, sImeFileName);<br>Result := ImpSetIme(0, pImePro); (* 呼叫 ImpSetIme *)<br>finally<br>Dispose(pImePro);<br>end; { of try }<br>end;<br>end; { of SetIme }<br>end. { of Unit Win31 }<br><br>
 
现在关键的问题是你把我上面的函数转化在DELPHI中是如何写法?特别是类型转换,请给我一个比较明确的答复好吗?<br>特别感谢你!!!
 
谢谢你,请你继续回答我的问题好吗?我现在最关键的问题是类型不会转换。
 
接受答案了.
 
后退
顶部