在线等待......如何在DLL中使用ADO控件连接数据库? (200分)

  • 主题发起人 JJHotWind
  • 开始时间
J

JJHotWind

Unregistered / Unconfirmed
GUEST, unregistred user!
  我用DLL Wizard生成一个默认的DLL项目,添加一个窗体和一个Unit并在Unit中导入
窗体的头文件后后,在外部程序(也是用C++Builder写的)中通过静态访问Unit的函数可
以访问到窗体,但只要窗体包含ADO控件(如ADOConnection或ADOQuery),我的函数就老
是要报错,错误信息为EOleSysError的“没有调用CoInitialize”。只要窗体不包含ADO
控件,就一切正常,可是我的DLL是一定要访问数据库的呀!而且,我也很不愿意用BDE或
别的什么方法来替代ADO。请教各位专家,这个问题该怎么解决呢?
  DLL中新建Unit的代码如:
  .H文件中:
    void __export TryADO();
  .CPP文件中:
    void __export TryADO()
    {
      //假定窗体的name是Form2。
      Form2 = new TForm2(Application);
      //这儿是窗体上一些控件的初始化代码,是不是要对ADO控件做些什么呢?
      Form2->ShowModal();
//好像就错在这儿。
      delete Form2;
    }
  在下区区菜鸟,为了这个问题已经被老板威逼了100遍了!请各位大富翁、小富翁、不
大不小中富翁看在在下以高分相送的情面上,能体察在下对各位如滔滔江水连绵不绝,又
好似黄河泛滥,一发而不可收拾的敬仰之情!
  请各位无论是砖头是玉,尽管往这里砸吧!
  
                                  拜托啦!
 
我用过没总题的,我想是你初始化的问题吧,你看一个你的Ado组件所在单元被Create了吗?
 
  请教zlj555,“你看一个你的Ado组件所在单元被Create了吗?”是什么意思呢?我是
新建了一个Form然后直接把ADO控件拽进去用的,就和一般的Application一样。
 
在单元初始化时调用一下CoInitialize函数就行了
最后记得unCoInitialize
 
  请教碧血剑,CoInitialize是个什么函数呢?在哪里定义的?我在C++Builder的帮助
里找不到这个函数的说明。能不能麻烦您给我解释的详细一些呢?最好能把我最上面的代
码改一下,让我看看究竟是怎么用的。谢谢!
 
The CoInitialize function initializes the Component Object Model(COM) library.
You must initialize the library before you can call its functions. Applications
must call CoInitialize before they make any other COM library calls with two
exceptions: the CoGetMalloc function, and memory allocation calls.
HRESULT CoInitialize(
LPVOID pvReserved //Reserved, must be NULL
);
CoInitialize 是系统 API,由于 ADO 是使用了 COM,而使用 COM 前必须先初试化
COM 库,就是用这个函数了。在创建 ADO 对象之前调用就可以了,最好是在单元或
主窗口的初试化部分调用它。结束后记得调用 CoUninitialize。
 
  请教beta,能不能写一个示范的代码呢?比如说:我的窗体叫MyForm,有一个
ADOConnection控件叫MyADOConnection,有一个ADOQuery控件叫MyADOQuery,函数中初始
化窗体的代码是:MyForm = new TMyForm(Application);,CoInitialize函数该怎么写呢?
写在哪里呢?
CODE:
  #include MyForm.h
  void __export TryADO()
  {
    MyForm = new TMyForm(Application);
    MyForm->Edit1->Text="TryADO";
    MyForm->...->...=...;
    ......;
    MyForm->ShowModal();
    delete MyForm;
  }
 
  还有一个问题想请教各位,delete是用来释放对象占用的内存空间的吗?那么如果我
在一般的应用程序中手动生成了一个对象(如:TListbox *MyListBox = new
TListBox(Application;),是否需要在不再使用的时候将它delete呢?谢谢!
 
//TListbox *MyListBox = new TListBox(Application);
注意你带的参数:Application,它代表在应用程序释放的时候会自动帮你释放这个对象
带参数 this 也同理。如果代 NULL 参数,则没有人对它负责,才需要手动释放。
你那个实例,就在 MyForm 创建前调用 CoInitialize 即可:
CoInitialize(NULL);
MyForm = new TMyForm(Application);
...
 
CoInitialize函数应该在ActiveX单元
在单元initialization部分写CoInitialize(nil);
finalization部分写CoUninitialize;
我是用Delphi的,我觉得在C++中是一样的
 
  多谢BETA提点,我正在努力尝试中!
 
  我正在尝试beta的做法,编译的时候CoInitialize(NULL);通过了,但是最后按碧血剑
的说法,我在delete MyForm后面加上了:CoUninitialize(NULL);编译器提示:E2227
Extra parameter in call to __stdcall CoUninitialize()。是否能正确调用还没有试
过,这个CoUninitialize是不是该用,又该怎么用呢?
 
  致beta、碧血剑:
  CoInitialize成功了,现在可以用ADO了,只是还不知道怎么用CoUninitialize。
  我现在只觉得:I love you, I love you, I love you...
 
在你的 TMyForm 的 OnDestroy 事件里面啊:
CoUninitialize();
// 没有参数
 
  A-Li-A-Do,Beta!
 
  好像是成功了。
  多谢各位大力支持!
  分已送出,敬请查收!
  最后还有两个小问题:1.我把CoUninitialize();写在了delete MyForm;后面,不知道
这样做对不对?2.请问各位,你们是怎么知道CoInitialize()这个函数的呢?有什么资料可
查吗?
  谢谢!
 
多人接受答案了。
 
//你们是怎么知道CoInitialize()这个函数的呢
我听老千说的:)
 
我是看错误提示,到Delphi的Source目录里搜了一遍CoInitialize,看这是个什么东东
结果看到有这个函数,就先执行了,还看到了CoUnInitialize
就在最后执行的
 
顶部