为什么创建的DLL里不能用像ADO这样的OLE?!

fi9 2002-08-09 09:20:02
为什么创建的DLL里不能用像ADO这样的OLE?!
如果用了的话,调用时就会出错(EOleSysError异常)
...全文
28 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianlinlong 2002-08-17
  • 打赏
  • 举报
回复
贴主,看我这样(在dll中):
CoInitialize(NULL);
TForm1 *Form1;
Form1 =new TForm1(Application);//Form1有ADO组件
Form1->Show() ;
delete Form1;
大概意思是这样了。
jianlinlong 2002-08-17
  • 打赏
  • 举报
回复
在New出Form之前,加上:
CoInitialize(NULL);
试试看!
pp616 2002-08-17
  • 打赏
  • 举报
回复
不可以直接放在窗体上的。
需要自己new 那样就没事了。
fi9 2002-08-15
  • 打赏
  • 举报
回复
TO楼上:
1、我的代码很简单:在一个DLL中包含了一个Form,并写了一个过程来Create和Show这个Form,而这个Form里也包含了一个ADO,并ADO->Open;然后在另一个工程里调用DLL里的这个过程,而在调用时就产生EOleSysError异常。
2、楼上的程序里都没有看到一个与ADO有关的东东,都是DM?!
kingcaiyao 2002-08-13
  • 打赏
  • 举报
回复
下面一位网友写的代码(精华区有一张贴子):
int __stdcall Open(long _overtime,char* Params,char *message)
{
int ret=0;
Application->ProcessMessages();
HRESULT coret=CoInitialize(NULL);
switch (coret)
{
case S_OK:
break;
case S_FALSE:
strcpy(message,"Indicates that the library is already initialized or that it could not release default allocator.");
break;
case E_OUTOFMEMORY:
strcpy(message,"Indicates that it was unable to initialize because the system is out of memory.");
break;
case E_INVALIDARG:
strcpy(message,"Indicates the argument is invalid.");
break;
case E_UNEXPECTED:
strcpy(message,"Indicates an unexpected error occurred.");
break;
}
if(coret!=S_OK&&coret!=S_FALSE)
{
return -1;
}
try{
DM=new TDM(NULL);
}
catch(...)
{
strcpy(message,"创建数据模块失败!");
return -1;
}
// Application->CreateForm(__classid(TDM), &DM);
try
{
DM->Connect=true;
}
catch(Exception *E)
{
strcpy(message,"连接数据库失败!");
strcat(message,E->Message.c_str());
CoUninitialize();
return -1;
}
return ret;
}
//---------------------------------------------------------------------------
int __stdcall Close(long _overtime,char* Params,char *message)
{
int ret=0;
Application->ProcessMessages();
if(!DM)
{
strcpy(message,"没有数据模块的实例!");
return -1;
}
try
{
DM->Connect=false;
}
catch(Exception *E)
{
strcpy(message,"断开数据库失败!");
strcat(message,E->Message.c_str());
ret=-8888;
}
try
{
delete DM;
}
catch(...)
{
strcpy(message,"释放数据模块失败");
ret=-9999;
}
CoUninitialize();
return ret;
}
kingcaiyao 2002-08-13
  • 打赏
  • 举报
回复
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
//在这里加入一个数据模块
break;
case DLL_PROCESS_DETACH:
CoUninitialize();
break;

case DLL_THREAD_ATTACH:

break;

case DLL_THREAD_DETACH:

break;
}

return 1;
}
//---------------------------------------------------------------------------
piaorenqian 2002-08-13
  • 打赏
  • 举报
回复
To 楼主
1.你能贴出代码么?
2.int WINAPI DllEntryPoint(...)这个函数是DLL的入口函数。
3.你可以加一个数据模块呀。
fi9 2002-08-13
  • 打赏
  • 举报
回复
TO楼上:
1、没有提示一个CoI...函数没有调用?只是提示出现EOleSysError异常。
2、int WINAPI DllEntryPoint(...)这个函数是不是在DLL里面定义的?!如果不是又在哪里定义?!如果是怎么能这样调用:
Application->Initialize();
Application->CreateForm(__classid(TDM),&DM);
3、DM是一个数据模块?!那我没有数据模块只有ADO又怎么做法?!

diabloyj 2002-08-10
  • 打赏
  • 举报
回复
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
CoInitialize(NULL);
if (DM == NULL)
{
Application->Initialize();
Application->CreateForm(__classid(TDM),&DM);
}
return 1;
}
DM是一个数据模块
jianlinlong 2002-08-09
  • 打赏
  • 举报
回复
是不是提示一个CoI...函数没有调用?如果是,调用它就行了
ADO组件的使用需要利用支持COM的高级语言,例如ASP中的VBScript或者Visual Basic,甚至Delphi,微软的竞争对手Borland的一个产品,现在也支持使用ADO来访问数据库。   在新的编程框架.NET Framework中, 微软也提供了一个面向Internet的版本的ADO,称为ADO.NET。其对象模型和传统ADO差别很大。 ADO是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。为实现这一目标,微软在数据库和微软的OLE DB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。 开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO的一项属性远程数据服务,支持“数据仓库”ActiveX 组件以及高效的客户端缓存。作为ActiveX的一部分,ADO也是COM组件的一部分。ADO是由早期的微软数据接口??远程数据对象RDO演化而来的。RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。   ADO向我们提供了一个熟悉的,高层的对OLE DB的Automation封装接口。对那些熟悉RDO的程序员来说,你可以把OLE DB比作是ODBC驱动程序。如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLE DB的接口;如同不同的数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLE DB提供者(OLE DB provider)。目前,虽然OLE DB提供者比较少,但微软正积极推广该技术,并打算用OLE DB取代ODBC。   ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是DAO3.5的Dao350.dll所占内存的60%)。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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