OLE Auromation的大侠都来看看呀 :(

acaiacc 2011-02-17 05:02:51
遇到一个头疼的问题,希望有大侠能帮我解决了。

正在用VC做一个EXCEL插件,现在需要给给Exce的单元格设置字体颜色:
颜色的确是能设置成功。
但是如果给同一个单元格设置过两次颜色后(用户有可能会这么做),关闭EXCEl的时候程序会崩溃。提示内存啥啥无法访问,貌似是释放内存出错了。

关键代码如下:

Excels::Font ft;
ft.AttachDispatch(range.GetFont());
ft.SetName(_variant_t("verdona"));
ft.SetSize(_variant_t("12"));
ft.SetColorIndex(COleVariant((short)4));


如果去掉最后那一行就没任何问题!
SetColorIndex这个方法跟其他方法(SetSize,SetName)有什么不一样啊,迷惑了。

有没有谁知道是为什么呀......... :(
...全文
129 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
acaiacc 2011-02-23
  • 打赏
  • 举报
回复
我也是觉得是多次释放了同一个接口指针,但是不知道具体问题出在哪里了


你建议的那些方法我都已经试过了:
以前是用直接=赋值发现有这个问题,就全改成AttachDispatch这样试一试了,
AttachDispatch TRUE和FALSE都试过了,
去掉ReleaseDispatch也试过了
都没办法解决呀。

IDispatch接口貌似不需要AddRef?



jameshooo 2011-02-18
  • 打赏
  • 举报
回复
应该是引用计数的问题,不该释放的时候把组件释放了。

为什么调用AttachDispatch的时候第二个参数有的是TRUE有的是FALSE?知道含义是什么吗?我建议不要调用AttachDispatch,而是直接用 = 操作符,而且去掉所有对 ReleaseDispatch 的调用。
gw_net 2011-02-18
  • 打赏
  • 举报
回复
最后出错的时候,你看看汇编代码
把可意复现问题的代码发给我gw_net@163.com
acaiacc 2011-02-17
  • 打赏
  • 举报
回复
一下午都在折腾这破玩意了
莫名其妙呀
acaiacc 2011-02-17
  • 打赏
  • 举报
回复
给点意见呀
貌似这个函数应该很常用呀
为啥只有我有这个问题呢

UP
acaiacc 2011-02-17
  • 打赏
  • 举报
回复
整个函数的代码

void CExcelOWCManager::SetColor(int iRF ,int iRL ,int iCF ,int ICL,wstring strSheet,long lColor)
{
CImain* pImain = (CImain*)AfxGetApp();
ASSERT(m_pDocDisp);
log_info(_T("CExcelOWCManager::SetContIn called!"));
try
{
Excels::_Workbook m_excelBook = NULL;
Excels::_Worksheet m_excelSheet = NULL;
Excels::Worksheets m_excelSheets = NULL;
Excels::_Application m_excelApp = NULL;
m_excelBook.AttachDispatch(m_pDocDisp,TRUE);
m_excelSheets.AttachDispatch(m_excelBook.GetSheets(),FALSE);


int iCount = m_excelSheets.GetCount();
BOOL bFound = FALSE;
for (int i = 1 ; i <= iCount ; i++)
{
m_excelSheet.AttachDispatch(m_excelSheets.GetItem(COleVariant((long)i)),FALSE);
CString strSheetTemp = m_excelSheet.GetName();
CStrConverter strConv(strSheetTemp);
wstring strSheetName(strConv.pResult);
if (strSheetName == strSheet)
{
bFound = TRUE;
break;
}
m_excelSheet.ReleaseDispatch();
}
if (!bFound)
{
log_error(_T("CExcelOWCManager::SetContIn failed! can not find the specified sheet."));
m_excelSheets.ReleaseDispatch();
m_excelBook.ReleaseDispatch();
return;
}

for (int i = iRF ; i <= iRL ; i++)
{
for (int j = iCF ; j <= ICL ; j++)
{
try
{
CString strCell1 = _T("");
CString strCell2 = _T("");
strCell1.Format(_T("%d"),i);
strCell2.Format(_T("%d"),j);
CString strCell = GetCell(j+1,i+1);
Excels::Range range = NULL;
range.AttachDispatch(m_excelSheet.GetRange(COleVariant(strCell),COleVariant(strCell)),FALSE);

try
{
//Excels::Interior inter;
//inter.AttachDispatch(range.GetInterior());
//inter.SetColor(COleVariant((long)lColor));

Excels::Font ft;
ft.AttachDispatch(range.GetFont());
ft.SetName(_variant_t("verdona"));
ft.SetSize(_variant_t("12"));
ft.SetColorIndex(COleVariant((short)4));
}
catch (...)
{
}
range.ReleaseDispatch();
}
catch (...)
{
log_error(_T("CExcelOWCManager::SetContIn failed! SetValue failed"));
}
}
}

log_info(_T("before release excel resource"));
m_excelSheet.ReleaseDispatch();
m_excelSheets.ReleaseDispatch();
m_excelBook.ReleaseDispatch();
log_info(_T("after release excel resource"));
}
catch (...)
{
log_error(_T("CExcelOWCManager::SetContIn failed! release excel resource failed"));
return;
}
}

3,245

社区成员

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

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