全部身家求大牛解答,怎么把_ConnectionPtr变量当参数传进COM

猪八戒照镜子 2009-08-14 02:20:40
我在EXE程序里是这么做的
_ConnectionPtr m_spConnection;
m_spConnection.CreateInstance(__uuidof(Connection));
m_spConnection->Open(_bstr_t(szValue), "", "", NULL);//以上都没问题,szValue是连接参数

m_spAdo->SetConnPtr((unsigned short *)m_spConnection);//m_spAdo是组件,我想把数据库连接指针传进COM

//下面是组件里的SetConnPtr方法实现
//STDMETHODIMP CHCAdoService::SetConnPtr(TCHAR* pConnection)
//{
// TODO: 在此添加实现代码

// m_spConnection = (_ConnectionPtr)(pConnection);//m_spConnection 是组件里的_ConnectionPtr变量
// return S_OK;
//}

有没有什么方法把数据库连接指针传进来
...全文
300 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
gopojim 2009-09-16
  • 打赏
  • 举报
回复
以上是转的
gopojim 2009-09-16
  • 打赏
  • 举报
回复
请问在ATL中能否将ASP中的数据库连接对象conn传到COM中?
时间:2009-07-25 22:36:09 来源: 作者:
请问能否在ATL中将ASP中的数据库连接对象如:

Dim Conn
Set Conn = Server.CreateObject(;ADODB.Connection;)
conn.Open ;Driver={Microsoft ODBC for Oracle};; & _
;Server=server1;; & _
;Uid=dd;; & _
;Pwd=12345;;

这个conn对象通过COM的参数传到COM的方法中,在COM中可以直接用这个CONN 对象?
如果可行那请问方法的参数怎么写?是不是和_ConnectionPtr的对象一样用法?问题点数:0、回复次数:3|||1 在 你的 .idl文件中 加入 importlib(;C:\Program Files\Common Files\System\ADO\MSADO15.DLL;);

2 在 stdafx.h 中加入 #import ;C:\Program Files\Common Files\System\ADO\msado15.dll; no_namespace rename(;EOF;, ;EndOfFile;)

3 给你的ATL对象增加一个属性
名称: Connect
类型: _Connection
注意选择 propPputref
|||接上文:
注意选择 PropPutRef

4 给你的ATL类加一个私有成员: _ConnectionPtr m_ConnectionPtr;

相关的代码如下:
STDMETHODIMP YourOBJ::putref_ActiveConnection(_Connection *newVal)
{
if( m_ConnectionPtr!=0) m_ConnectionPtr=0;
m_ConnectionPtr = _ConnectionPtr( newVal);
return S_OK;
}

STDMETHODIMP YourOBJ::get_ActiveConnection(_Connection **pVal)
{
if( m_ConnectionPtr==0) return E_POINTER;
return m_ConnectionPtr->QueryInterface(__uuidof(_Connection),(void**)(pVal));

}

|||接上文:

勘误:

3 给你的ATL对象增加一个属性
名称: ActiveConnection
类型: _Connection*
注意选择 PropPutRef

猪八戒照镜子 2009-08-26
  • 打赏
  • 举报
回复
我只负责ADO组件,具体原因不是特别清楚,
可能是这么考虑的:每次数据库操作都是通过一个ADO组件来执行,只要传参数,就返回记录集(有点把数据库的东西封装起来的意思)

如果每次都做连接数据库操作影响效率,如果只用一个连接怕这个连接意外断掉,所以每次操作都由连接池给个活的连接。

不知道是不是有点四不像。。请指教
蒋晟 2009-08-17
  • 打赏
  • 举报
回复
建议连接关闭越快越好,避免占用连接池资源。你为什么要传连接?把数据读出来传不行么?
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
最大只有100啊。。。

猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
我再好好试试
坚决不辜负您的期望~~

结贴了
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
我也累死了~~~
雪影 2009-08-14
  • 打赏
  • 举报
回复
我用过,没问题的,不知道你怎么写的。算了,其实还有不少办法实现你的目的的。
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
import "oaidl.idl";
import "ocidl.idl";

[
object,
uuid(B41D7A6C-F435-48E4-87E5-E60CF3720FDA),
dual,
nonextensible,
helpstring("IHCAdoService 接口"),
pointer_default(unique)
]
library HCAdoLib
{

importlib ("stdole2.tlb");
importlib ("C:\Program Files\Common Files\System\ado\msado15.dll");
[
uuid(E6849756-06CB-4E00-B889-4F7CBE08C199),
helpstring("HCAdoService Class")
]
coclass HCAdoService
{
[default] interface IHCAdoService;
};
};
interface IHCAdoService : IDispatch{
[id(1), helpstring("方法execQuery")] HRESULT execQuery([in] TCHAR* sql, [out] LPDISPATCH** ppRecordset);
[id(2), helpstring("方法execDML")] HRESULT execDML([in] TCHAR* sql);
[id(3), helpstring("方法SetConnPtr")] HRESULT SetConnPtr([in]_ConnectionPtr pConnection);
};
[
uuid(DD82DE12-5050-48AD-BEBD-941FA958955D),
version(1.0),
helpstring("HCAdo 1.0 类型库")
]

我的
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 tttyd 的回复:]


library HCAdoLib    //Library必须手动提前

[
uuid(DD82DE12-5050-48AD-BEBD-941FA958955D),
version(1.0),
helpstring("HCAdo 1.0 类型库")
]
library HCAdoLib  //这里要提前
{
importlib("stdole2.tlb");
importlib ("C:\Program Files\Common Files\System\ado\msado15.dll")
};

interface IHCAdoService : IDispatch{
[id(1), helpstring("方法execQuery")] HRESULT execQuery([in] TCHAR* sql, [out] LPDISPATCH** ppRecordset);
[id(2), helpstring("方法execDML")] HRESULT execDML([in] TCHAR* sql);
[id(3), helpstring("方法SetConnPtr")] HRESULT SetConnPtr([in]_ConnectionPtr pConnection);
};

累死我了
[/Quote]

提前了 还是那两行错误。。。。
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
雪影大哥的应该也可以的啊

但就是出错,相当谢谢。。。

看下我有多少分,全给你们了
雪影 2009-08-14
  • 打赏
  • 举报
回复
参考我给你的例子
在27楼
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 skybblue 的回复:]
Com组件的参数用LPDISPATCH类型好了,这样就可以传递过去了
STDMETHODIMP CHCAdoService::SetConnPtr(LPDISPATCH lpDispatch)
{
    m_spConnection = lpDispatch;
}
[/Quote]

大牛啊。。。
搞定了
靠,就这么简单啊
雪影 2009-08-14
  • 打赏
  • 举报
回复
类库的导入要在接口声明的前面

即library HCAdoLib要在
interface IHCAdoService前面
雪影 2009-08-14
  • 打赏
  • 举报
回复


library HCAdoLib //Library必须手动提前

[
uuid(DD82DE12-5050-48AD-BEBD-941FA958955D),
version(1.0),
helpstring("HCAdo 1.0 类型库")
]
library HCAdoLib //这里要提前
{
importlib("stdole2.tlb");
importlib ("C:\Program Files\Common Files\System\ado\msado15.dll")
};

interface IHCAdoService : IDispatch{
[id(1), helpstring("方法execQuery")] HRESULT execQuery([in] TCHAR* sql, [out] LPDISPATCH** ppRecordset);
[id(2), helpstring("方法execDML")] HRESULT execDML([in] TCHAR* sql);
[id(3), helpstring("方法SetConnPtr")] HRESULT SetConnPtr([in]_ConnectionPtr pConnection);
};

累死我了
skybblue 2009-08-14
  • 打赏
  • 举报
回复
Com组件的参数用LPDISPATCH类型好了,这样就可以传递过去了
STDMETHODIMP CHCAdoService::SetConnPtr(LPDISPATCH lpDispatch)
{
m_spConnection = lpDispatch;
}
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
import "oaidl.idl";
import "ocidl.idl";

[
object,
uuid(B41D7A6C-F435-48E4-87E5-E60CF3720FDA),
dual,
nonextensible,
helpstring("IHCAdoService 接口"),
pointer_default(unique)
]
interface IHCAdoService : IDispatch{
[id(1), helpstring("方法execQuery")] HRESULT execQuery([in] TCHAR* sql, [out] LPDISPATCH** ppRecordset);
[id(2), helpstring("方法execDML")] HRESULT execDML([in] TCHAR* sql);
[id(3), helpstring("方法SetConnPtr")] HRESULT SetConnPtr([in]_ConnectionPtr pConnection);
};
[
uuid(DD82DE12-5050-48AD-BEBD-941FA958955D),
version(1.0),
helpstring("HCAdo 1.0 类型库")
]
library HCAdoLib
{
importlib("stdole2.tlb");
importlib ("C:\Program Files\Common Files\System\ado\msado15.dll")
[
uuid(E6849756-06CB-4E00-B889-4F7CBE08C199),
helpstring("HCAdoService Class")
]
coclass HCAdoService
{
[default] interface IHCAdoService;
};
};

还是那两行错误
1>.\HCAdo.idl(21) : error MIDL2025 : syntax error : expecting a type specification near "_ConnectionPtr"
1>.\HCAdo.idl(21) : error MIDL2026 : cannot recover from earlier syntax errors; aborting compilation
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 yswlqj 的回复:]
偶好像有点跑题,不好意思哈
[/Quote]

来捧场就好,谢谢啦
雪影 2009-08-14
  • 打赏
  • 举报
回复
importlib("C:\Program Files\Common Files\System\ADO\MSADO15.DLL");
单斜线不是双斜线
猪八戒照镜子 2009-08-14
  • 打赏
  • 举报
回复
啊。。。。

地方添加错了。。
我再试试
加载更多回复(28)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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