DLL的一个小问题...(给100分)

RealFox2000 2003-07-03 10:53:57
我象写一段Dll的代码,实现在其被载入时调用CoInitialion(nil),被卸出时调用
CoUnInitialion。大家能给我个思路或代码吗?(那个重定向DllProc的办法太恶心,我就不想说了。)
另外,在Dll中能使用ADO系列的组件吗?
...全文
27 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seahilly 2003-10-30
  • 打赏
  • 举报
回复
up
saien 2003-10-30
  • 打赏
  • 举报
回复
ADO是可以使用的!
ly_liuyang 2003-07-07
  • 打赏
  • 举报
回复
使用EntryPoint的方法比较好

凡是ActiveX的调用都要那句代码的了

ADO是可以使用的!
programgirl 2003-07-07
  • 打赏
  • 举报
回复
然後, 呼叫与使用就与一般的Delphi 没有两样5. 上述是直接写到呼叫DLL函式的程式单元中, 此外,也可以将DLL的呼叫宣告集中到一个程式单元(Import unit), Delphi 内附的 WinTypes, WinProcs是一个例子,您可以参考一下,同时观察一下 C 与 Pascal 互相对应的资料型态6. 除了上述的 static import 的方式, 另外有一种 dynamic import 的写法,先宣告一个程序类型(procedural-type),程式执行时, 以LoadLibrary() API Load进来後, 再以 GetProcAddress() API 取得函式的位址的方式来连结呼叫, 在ObjectPascal Language Guide P.132-133 有一个例子, 您可以参考看看,如果要举个例子, 以下是从我以前的程式节录出来的片断:

(* for CWindows 3.1 *)
unit Ime31;
interface
uses
SysUtils, WinTypes, WinProcs, Dialogs;
type
(* 必要的资料型态宣告 *)
tDateNTime = record
wYear, wMonth, wDay: word;
wHour, wMin, wSec: word;
end;
TImePro = record
hWndIme: HWnd; { IME handle }
dtInstDate: tDateNTime; { Date and time of installation }
wVersion: word; { the version of IME }
szDescription: array[0..49] of byte; { Description of IME module}
szName: array[0..79] of byte; { Module name of the IME }
szOptions: array[0..29] of byte; { options of IME at startup}
fEnable: boolean; { IME status; True=activated,False=deactivated }
end;
pTImePro = ^TImePro;
function SetIme(const sImeFileName: string): boolean; far;
implementation
(* begin 呼叫 winnls.dll export 函数的宣告 *)
function ImpSetIme(hWndIme: HWND; lpImePro: pTImePro): boolean;far; external ’winnls.dll’;
(* end 呼叫 winnls.dll export 函数的宣告 *)
(* -------------------------------------------------- *)
(* SetIme(const sImeFileName: string): boolean;
(* ======
(* 切换到某一特定的输入法
(*
(* 传入引数:
(* sImeFileName: 输入法 IME 档名, 例: phon.ime;
(* 空字串: 英数输入法
(*
(* 传回值:
(* True: 切换成功
(* False: 失败
(* -------------------------------------------------- *)
function SetIme(const sImeFileName: string): boolean;
var
pImePro: pTImePro;
begin
Result := False;
if MaxAvail < SizeOf(TImePro) then
begin
MessageDlg(’记忆体不足’, mtWarning, [mbOk], 0);
Exit;
end
else
begin
New(pImePro);
try
if sImeFileName = ’’ then (* 空字串, 还原到英数输入法 *)
pImePro^.szName[0] := 0
else
StrPCopy(@pImePro^.szName, sImeFileName);
Result := ImpSetIme(0, pImePro); (* 呼叫 ImpSetIme *)
finally
Dispose(pImePro);
end; { of try }
end;
end; { of SetIme }
end.
豹子辰 2003-07-04
  • 打赏
  • 举报
回复
实现在其被载入时调用CoInitialion(nil),被卸出时调用CoUnInitialion。

写在构造函数和析构函数里面不行么?
RealFox2000 2003-07-04
  • 打赏
  • 举报
回复
可是我的程序不能使用DLL,莫名其妙的出错。而且sz1008(dot) 老兄说的办法能给个详细代码吗?粘贴在这里就行了。
myling 2003-07-04
  • 打赏
  • 举报
回复
调用CoInitialion(nil)和CoUnInitialion就是为了在Dll中能使用ADO系列的组件


否则这两句没有用(除非你还调用COM)
Behard 2003-07-04
  • 打赏
  • 举报
回复
应该是在 DllEntryPoint 中实现的
看我在 BCB 中使用的代码:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH: //初始化 COM
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH: //释放 COM
CoUninitialize();
break;

case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
wsz1995 2003-07-03
  • 打赏
  • 举报
回复
可以啊, 我就是在DLL 中用ADO组件
uses activex;
procedure dllentrypoint(dreason : dword);
begin
case dreason of
0 : CoUnInitialion
1 : CoInitialion(nil)
end;
end;
begin
Dllproc := @dllentrypoint;
dllentrypoint(1);
end;
李_军 2003-07-03
  • 打赏
  • 举报
回复
在Dll中能使用ADO系列的组件!
可以在
dll的
begin
写CoInitialion(nil)
end
在不用ADO控件后
CoUnInitialion。
sz1008 2003-07-03
  • 打赏
  • 举报
回复
在Unit的Initalization与FInitalization中定义
xianxiliu 2003-07-03
  • 打赏
  • 举报
回复
在Dll中能使用ADO系列的组件!
Wally_wu 2003-07-03
  • 打赏
  • 举报
回复
在调用Dll前加上这些语句﹕
Try
CoInitialion(nil);
…… //Called Dll function
Finally
CoUnInitialion;
End;


在Dll中能使用ADO系列的组件吗?
答﹕可以

hansion3406 2003-07-03
  • 打赏
  • 举报
回复
呵呵..帮不上忙..

16,742

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧