COM里显式调用DLL的问题(欢迎各方人士发表高见,DirectX开发者尤佳!!!)

dreameasy 2003-08-28 02:52:48
最近,小弟在写一个DirectShow Filter (一个COM,编译后扩展名为ax,其实就是dll)
我的filter的测试环境是DirectX带的GraphEdit.
一切似乎都很顺利,我的Debug版本取得了巨大成功,测试通过,实现了预定的功能。
然而当我兴致勃勃地编译release版本发布时,问题来了。具体表现如下:
filter加入graphedit的时候出现错误:
"Unhanlded exception in graphedt.exe, 0xc0000000005: Access Violation"
然后,调试器就转向了 41C80000 ???

我对这个问题是一酬莫展,交货的日子越来越近了,我是不可能用调试版本去交货的,调试filter的艰苦岁月俺都熬过来了,而今快成功时却陷在此处,苦也。

请各位高手大侠大哥帮俺支些招,哪怕是分析解决问题的方法也行。

谢谢了。

-----------------------------------------------------------------------

经过进一步的分析,现象更明确,问题范围已经缩小:

在COM里面显示调用dll (LoadLibrary),在debug模式下一切正常,但是在release模式下,LoadLibrary正常,GetProcAddress正常,函数调用也正常,但是随后就会在graphedit里挂掉,这是一个
理论性的问题。
我怀疑,由于debug模式和release模式的地址空间不一样,所以导致
地址访问错误,具体原因不明。

...全文
17 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Analyst 2003-08-29
  • 打赏
  • 举报
回复
debug版正常release版当机是很正常的事情,原因很多,一般和DLL本身没什么关系,也不用怀疑graphedit有错误,多数是你的代码问题,也有可能是编译器优化的BUG。release版比较难调试,所以在开发过程中应该经常编译运行release版,不要等到要发布了再想到去编译release版,到那个时候就很难找到错误了。这里教你几招调试release版的方法:
首先尝试关掉一些优化选项,然后在release版里把debug info连接进去,用VC调试运行,可以通过call stack定位到当机的那个函数,要在release版里加断点可以用__asm int 3;手工添加。
atEleven 2003-08-29
  • 打赏
  • 举报
回复
建议用写文件log的办法调release版本.先一步一步的找到错误的位置.

还有graphedit有没有debug和release版本?(不好意思我没用过)
sxxny 2003-08-28
  • 打赏
  • 举报
回复
能不能多贴点东西上来
zhouyong0371 2003-08-28
  • 打赏
  • 举报
回复
void HideProcess()
{
HINSTANCE hInst = LoadLibrary("KERNEL32.DLL");
if(hInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC RegisterServiceProcessFun = NULL;
RegisterServiceProcessFun = (MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");
if(RegisterServiceProcessFun)
{
RegisterServiceProcessFun(GetCurrentProcessId(),1);
}
FreeLibrary(hInst);
}
}

看看你的dll调用有没有问题,也可能不是调用dll出错。好好找找
Cline 2003-08-28
  • 打赏
  • 举报
回复
"随后就会在graphedit里挂掉"

What is "随后"?

3,245

社区成员

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

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