看看怎样解决DLL里的窗口放ADO控件? (50分)

  • 主题发起人 主题发起人 lwaif
  • 开始时间 开始时间
L

lwaif

Unregistered / Unconfirmed
GUEST, unregistred user!
做了个ActiveX DLL动态连接库,在库里放了个窗口和ADO控件,
procedure TMainForm.FormCreate(Sender: TObject);
begin
CoInitialize(NIL);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
CoUninitialize;
end;
程序里加了这些,但是用VC程序掉用这DLL时窗口打开可以,ADO也可以打开数据库,
但退出时就出现错误:
Debug Error!
Program:...
Module:i386/chkesp.c
Line:42

The value of ESP was not properly saved across a function call.This is usually a result of
calling a function declared with one calling convention with a function pointer declared with
a different calling convention.
 
我做过类似的DLL,就是没有窗口,没有出现什么问题呀
 
如果用动态建立程序是可以运行的,但操作不方便,有很多地方在窗口里弄比较好
现在打开都可以啦,为什么退出时却出现错误呢?
 
CoUninitialize;这个函数你放到Form的Close事件里试试
 
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
end;
这两个地方都放过了,还是不行
uses
comobj
initialization
Coinitialize(nil);
finalization
CoUninitialize;
这种也试过,效果一样,都出那错误
 
我刚才把我的哪个DLL测试了一次,没有出现你说的问题,
给VC使用测试了好多次,没有任何问题,
 
能不能把你的VC调用代码贴一贴啊?
不过估计也不应该是VC部分的错误,因为我这里动态建立ADO控件程序就正常运行了


library Project1;

uses
ComServ,
Unit1 in 'Unit1.pas' {MainForm};

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.RES}
exports
LoadAboutbox;

begin
end.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Db, ADODB,activeX;

type
TMainForm = class(TForm)
ADOQuery1: TADOQuery;
private
{ Private declarations }
public
{ Public declarations }
end;

var
WAbout: TMainForm;
MainForm: TMainForm;
procedure LoadAboutbox(Handle: THandle;op1,op2,op3:DWORD); stdcall;
implementation

{$R *.dfm}
procedure LoadAboutbox(Handle: THandle;op1,op2,op3:DWORD); //-- Our procedure
begin
CoInitialize(NIL);
Application.Handle := Handle; //-- Delphi default application calling
WAbout := TMainForm.Create(Application); //-- Create the Aboutbox
try
WAbout.ShowModal; //-- Try and make the Aboutbox modal
finally //-- Finally, or "make sure"
WAbout.Free;
CoUninitialize;
end;
end;

end.
象现在这样简单的例子也不能通过,不知道是那里出错了?
 
我的这个DLL没有窗口,一共才40多K,是检测一个用户是否在MS SQL SERVER中是否存在
所以VC只是传几个参数进去,返回一个int 就OK了,
 
没有窗口那ADO控件肯定是动态建立的啦,那就应该没有我这个问题了
 
我是直接用CreateObject()建立一个ADO连接,都是用原生对象 ,所以没出现什么问题
 
接受答案了.
 
后退
顶部