遇到两个很头大的问题,并且不太好描述,低手高手都请进......

叶帆 2005-12-02 03:11:47
1、在开发OPC客户端驱动时,发现这么个问题,OPC驱动为MFC 6.0开发的DLL(MFC 扩展)。
此DLL中用到COM的一些函数,发现DLL在执行CoInitialize后,前台VB做的程序,凡是含有微软SSTab控件的窗体一律打不开。(我试了很多机器,只有我的笔记本没有问题,其它的不管XP还是Win2000都有问题。
无怪SSTab控件我们很难自己开发,看来用到很多COM深层的东西。


2、用微软Script Control控件ExecuteStatement执行脚本命令,发现只要执行任何代码,哪怕一个注释“’”,也会有内存泄漏
在XP Sp2的机器上没有什么问题,在Win2000 个别机器上有问题,XP 没有补丁,SP1的都有泄漏。


-----谢谢-----顶者有分----
...全文
473 点赞 收藏 34
写回复
34 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yorkness 2005-12-09
低手,满天都是星星,眼都花了
回复
OhPrettyLady 2005-12-08
求教高手:
我的RichTextBox中不同的行高度有可能都不同,而且也有些图片,行间距也有不同。

请问我如果定位到某一行后,如何获取本行的行高呢???

解决奉献自己全部积分(110分),决不失言!!!

http://community.csdn.net/Expert/topic/4447/4447163.xml?temp=.2219965
回复
weiyulin 2005-12-06
随便问各位老师 COM 究竟是个什么东西 我感觉好神密。。。

在下先谢谢了。。。。
回复
weiyulin 2005-12-06
帮你顶,但不懂。。。
回复
叶帆 2005-12-05
目前问题基本上解决,目前发现,对
CoInitialize(NULL);
CoUninitialize();
必须在同一线程,否则就会出现以上问题。

不过又出现了新的问题:

先描述一下我的程序结构: YFIOServer.exe(VB开发) --> 调用 YFIOS.dll -->调用 YFOPCClient.dll

刚才的程序就是说的是“YFOPCClient.dll”里面的程序,

现在的问题是在 YFOPCClient.dll 调用 YFIOS.dll 里提供的方法(用SendMessage 想YFIOServer.exe发送消息)出现问题,SendMessage没有返回。
我目前用笨办法解决了,不过代码太不优美了,很让我恼火。
回复
seven2015 2005-12-03
帮顶吧!
回复
agg168168 2005-12-03
还是不懂,低手,
回复
sanduVB 2005-12-03
在其它机上也把VB装上试一下。
可能是VB中的某一个文件在起作用。
回复
韧恒 2005-12-03
SSTab的确有很多问题,我通常使用TabStrip,尽管会多写点代码。
不过针对楼主的问题,qkaibo(艾夏)的话是有一定道理的,即然你的笔记本没有问题,那么在其他机器上也应该可以。
回复
Mr_Yang 2005-12-03
顶~~
回复
zfl2k 2005-12-03
低手,估计原因是你笔记本上的某个程序刚好用到了某个dll,刚好符合了sstab和opc的某个环境,于是没出问题。把你的系统ghost到台式机看看。
不过既然是sstab的问题那就不用就行了。
回复
zhzhq800204 2005-12-03
我是低手,帮顶了。
回复
foreverstar2004 2005-12-03
呵,这么多高手,看来我只能凑热闹了哈!帮LZ顶一下吧!
回复
叶帆 2005-12-03
以上现象,我的笔记本没有问题,家里的台式机出现以上现象(公司里的同事的各种机器,都有此现象)。

此外还有一点现象区别:
1、在我的笔记本上,第一次启动OPC Client,相应服务器打开,关闭Client,服务程序自动关闭;第二次,多次都是这样
2、在家里的台式机,第一次启动OPC Client,相应服务器打开,关闭Client,服务程序自动关闭;第二次启动OPC Client,相应服务器打开,关闭Client,服务程序不自动关闭。第n次,现象一样,不会自动关闭。
回复
叶帆 2005-12-03
【更进一步的信息】:

现象:
1、在运行OPC Client之前,打开含TabStrip的窗体,则运行OPC Client后,该窗体打开正常
2、在运行OPC Client之前,不打开含TabStrip的窗体,则运行OPC Client后,该窗体打不开,与用SSTab的窗体一样。

不特指 “TabStrip”控件,只要窗体是含有非VB基本控件,就出现以上现象。
对于第2条,弹不出窗体,出现7号 运行时,内存溢出错误的信息。

我目前的解决办法,在主窗体开始的时候(执行load事件的时候),对含有非VB基本控件的窗体Load一下,马上在Unload。以上现象消除。

可是SSTab控件问题依然,只是我不用它了。
回复
叶帆 2005-12-03

------发生了更奇怪的事情-----

我用了一上午,把SSTab替换为TabStrip,奇怪的事情发生了

现象:
1、在运行OPC Client之前,打开含TabStrip的窗体,则运行OPC Client后,该窗体打开正常
2、在运行OPC Client之前,不打开含TabStrip的窗体,则运行OPC Client后,该窗体打不开,与用SSTab的窗体一样。



回复
qkaibo 2005-12-02
,只有我的笔记本没有问题,其它的不管XP还是Win2000都有问题。

一般情况下不要怀疑微软的错 在你的笔记本上可以 在其它机器上不行 一般肯定是哪个主件没安装或者 关联的主件的版本不对

就比如form2.0控件 怎么弄都出错 非得拿微软的原安装包才行
回复
lsgis2001 2005-12-02
顶了,曾经用过SSTAB,但没有发现这样的问题,
回复
叶帆 2005-12-02
hGroup=0;
hServer=0;

CoUninitialize(); //关闭COM <-----【这就是罪魁祸手】

return 0;
}

... ...
回复
叶帆 2005-12-02
VB访问OPC是采用的自动化接口,需要N多DLL,比较讨厌人,此外我要生成标准的DLL(我开发的后台IOserver的标准驱动程序),所以用控件不适合。
这是VC 部分的代码(也许放在这里不适合,不过没有办法,总感觉VB是母语)
【详细部分】http://blog.csdn.net/yefanqiu/archive/2005/12/02/542447.aspx

//*************************************************************************
//函 数 名:ConnectOPC
//所属类名:COPCClien
//输 入:CString SvrName
//输 出:
//功能描述:连接OPC服务器
//全局变量:
//调用模块:
//作 者:叶帆
//日 期:2005年12月1日
//修 改 人:
//日 期:
//版 本:
//*************************************************************************
long COPCClient::ConnectOPC(CString cSvrName)
{
HRESULT hr;
CLSID clsid;
WCHAR wszProgID [512];

//----------------------------------
//初始化COM
hr =CoInitialize(NULL);
if (FAILED(hr)) return 8; //com初始化失败

//-----------------------------------
if(strSvrName!="") //判断是否已经连接OPC
{
if (strSvrName==cSvrName) return 2; //OPC服务器已经连接
else return 4; //只能连接一个OPC服务器
}
//-----------------------------------

try
{

//----------------------------------
//把字符串形式的对象标识转化为CLSID结构形式
_mbstowcsz (wszProgID, cSvrName, sizeof (wszProgID) / sizeof (WCHAR));
hr= CLSIDFromProgID(wszProgID, // [in]
&clsid); // [out]
if(FAILED(hr))
{
CoTaskMemFree(&clsid); //COM 内存释放函数
CoUninitialize(); //终止COM库功能服务
return 16; //获取clsid失败
}

//--------------------------------
//创建Server实例
hr=CoCreateInstance(clsid, //[in]
NULL, //[in]
CLSCTX_SERVER, //[in]
IID_IUnknown, //[in]
(void**)&pUNK); //[out]

if(FAILED(hr))
{
CoTaskMemFree(&clsid);
if(pUNK) pUNK->Release();
pUNK=NULL;
CoUninitialize();
return 32; //创建Server实例失败
}

//------------------------------------
//查询pOPC接口
hr=pUNK->QueryInterface(IID_IOPCServer,// [in]
(void**)&pOPC);// [out]
if(FAILED(hr))
{
CoTaskMemFree(&clsid);
if(pOPC) pOPC->Release();
if(pUNK) pUNK->Release();
pOPC=NULL;
pUNK=NULL;
return 64; //查询pOPC接口失败
}

CoTaskMemFree(&clsid);

//---------------------------
strSvrName=cSvrName; //赋值当前OPC服务名称


}
catch(...)
{
return 128; //连接服务器时出现严重错误
}
return 0; //成功
}

//*************************************************************************
//函 数 名:DisconnectOPC
//所属类名:COPCClient
//输 入:
//输 出:long
//功能描述:断开OPC服务器
//全局变量:
//调用模块:
//作 者:叶帆
//日 期:2005年12月1日
//修 改 人:
//日 期:
//版 本:
//*************************************************************************
long COPCClient::DisconnectOPC()
{
if(strSvrName=="") return 1; //OPC服务器尚未连接

HRESULT *pErrors = NULL;
DWORD dwCount=mIOMDevice->mItem.GetSize(),i;

strSvrName=""; //服务器名称清空

//---------------
OPCHANDLE *phServer = NULL;
//停止异步操作
pIAsync2->SetEnable(false);

//移除标签
phServer = (OPCHANDLE *) CoTaskMemAlloc (dwCount * sizeof (OPCHANDLE));
for(i=0;i<dwCount;i++) phServer[i] = (OPCHANDLE)arrhServer.GetAt(i);

pIItemMgt->RemoveItems(dwCount, // [in]
phServer, // [in]
&pErrors); // [out]

arrhServer.RemoveAll();
arrhServer.FreeExtra();
arrItemType.RemoveAll();
arrItemType.FreeExtra();

//删除组
pOPC->RemoveGroup(hServer, //[in]
true); //[in]

//---------------
CoTaskMemFree(&hServer);
CoTaskMemFree(&hGroup);

if(pErrors) CoTaskMemFree(pErrors);
if(pResults) CoTaskMemFree(pResults);

if(pIAsync2) pIAsync2->Release();
if(pISync) pISync->Release();
if(pIItemMgt) pIItemMgt->Release();
if(pOPC) pOPC->Release();
if(pUNK) pUNK->Release();

pOPC=NULL;
pUNK=NULL;
pIItemMgt=NULL;
pIAsync2=NULL;
pISync=NULL;
hGroup=0;
hServer=0;

CoUninitialize(); //关闭COM

return 0;
}

... ...

回复
加载更多回复
相关推荐
发帖
控件
创建于2007-09-28

1428

社区成员

VB 控件
申请成为版主
帖子事件
创建了帖子
2005-12-02 03:11
社区公告
暂无公告