用delphi写了个ocx,注册成功了,在网页上访问出现读地址错误。Access violation at address OCB2366E in module

  • 主题发起人 主题发起人 lian888
  • 开始时间 开始时间
L

lian888

Unregistered / Unconfirmed
GUEST, unregistred user!
用delphi写了个ocx,注册成功了,在网页上访问出现读地址错误。Access violation at address OCB2366E in module ( 积分: 100 )<br />用delphi写了个ocx,注册成功了.
网页的代码如下。clsid写的没有错,在有些机子可以用,不会出错。有些机子会出现以下错误:Access violation at address OCB2366E in module 'AgentState.ocx'.Read of address 00000000.
重启了机子又不会了,但过一会又会出现这样的错误了。
<OBJECT id=&quot;Agent&quot;

classid=&quot;clsid:90514A11-8CD6-47F7-8FF1-D6E93F8B96E8&quot;
width=100
height=100
align=center
hspace=0
vspace=0
>
</OBJECT>

请大家帮忙!:)
 
ocx注册了没?
Run>Register ActiveX Server
 
网页上的代码没有错,是不是ocx里面的代码出错了?
 
ocx注册了,&quot;运行---regsvr32 路径&quot;,提示注册成功了!
ocx里面的代码应该没有错,我是先做好例子然后再转移到active form里面的,况且有些机子可以运行啊.

请大家帮忙再想想!
 
楼主不用看了,这段脚本没有问题,是你的ocx有bug
 
肯定是你的ocx内部有问题
我前阵子刚写了个OCX也发现不了少问题
你再仔细看一下OCX代码吧
有没有内存错误
 
肯定是ocx里的代码有bug,而且是根据不同的系统,不同的时间均有可能出现!得仔细的测试一下,我也曾经出现过类似的情况,最后才找出代码的bug!
 
ocx内部有问题
 
如果是dax error,去搜dax error ,网上有答案的
 
如果你想花最少的钱学习流行的计算机技术,本人低价提供
计算机专业高清晰 视 频 教 程,所有教程由业内名家讲解,物超所值,
所有光盘4元/张,特快专递全国三天内到货.
联系方式:手 机:1 3 5 76145612(手机联系佳) Q Q:108410943
E-mail:ncncldjjg@126.com
1、Oracle9iOCP(Oracle认证专家DBA)视频教程(23CD)
2、SQL语言、数据挖掘、SQLServer2000视频教程(6CD)
3、计算机网络原理视频教程(4CD)
4、计算机实用组网技术视频教程(3CD)
5、MCSE(微软认证系统工程师)认证视频教程(11CD)
6、windows2003即学即会视频教程(6CD)
7、J2EE Web程序开发定向班/Java就业班视频教程
(java基础jsp核心技术UML设计)(13CD)
8、J2EE基础高级案例分析视频教程(9CD)
9、马士兵J2SE入门与精通(含坦克大战、BBS实例)视频教程(6CD)
10、java语言深入详解视频教程(12CD)
11、java技术从入门到精通视频教程(21CD)
12、javascript全接触视频教程(13CD)
13、各类网站源程序(9CD)
14、unix原理视频教程(3CD)
15、Linux软件开发工程师(C语言)视频教程(4CD)
16、Linux配置、管理、优化实战工程师视频教程(8CD)
17、Linux内核编程视频教程(11CD)
18、C语言详解视频教程(2CD)
19、VC++6.0(MFC)开发技术术详解视频教程(6CD)
20、ASP.NET中文视频教程(3CD)
21、洪恩C#入门多媒体教程(1CD)
22、XML技术视频教程(2CD)
23、操作系统视频教程(3CD)
24、网络技术基础视频教程(2CD)
25、数据结构视频教程(5CD)
26、清华大学计算机专业多媒体教程(数据结构、汇编、编译原理等)(13CD)
27、大学数学[离散数学线性代数概率与数理统计微积分]视频教程(22CD)
28、LearnKey Asp.Net (老外用英语讲课)(13CD)
29、LearnKey Asp.Net Webservice(老外用英语讲课)(5CD)
30、AppDev Asp.Net2.0 UsingC# (老外用英语讲课)(1CD)
31、APPDev .Net Framework(老外用英语讲课)(2CD)
32、林清安pro/e2001(野火版)视频教程(18CD)
33、深圳大学3D设计视频教程(4CD)
34、3DMAX建模视频教程(老外用英语讲课)(6CD)
35、3DMAX纹理与贴图材质灯光视频教程(老外用英语讲课)(5CD)
36、3DMAX格式500个常用模型库(4CD)
37、lightscape基础入门视频教程(2CD)
38、聚光制造(lightscape3.2入门与精通视频教程)(4CD)
39、coreldraw12中文版入门与精通swf格式视频教程(2CD)
 
我又查了一个代码没什么问题,而且大部分机子都运行正常啊.
 
找到原因了.是因为打开多个IE页面会这样,把其他网页都关了就剩下ocx那个页面就不会出现那个错误了.
但这要怎么解决呢?
 
这是由于delphi的bug,详细参看:http://cc.codegear.com/Item/18656
解决:
1. copy 一份delphi的源码AxCtrls.pas,修改ParkingWindow函数,如下面
2. 请在Project中include AxCtrls.pas文件,并在菜单中Project-View Source
使用第一个unit为AxCtrls, 类似下面:
library myActiveX;
uses
AxCtrls in './D7_Fixed/AxCtrls.pas',
Forms,
...



修改AxCtrls.pas

// DAX error : access violation at address 000
// reason : delphi's ocx use same parking window procedure.
// one ocx must use individual parking window proc.
// http://cc.codegear.com/Item/18656
function ParkingWindow: HWND;
var
TempClass: TWndClass;
ParkingName : String;
begin

Result := xParkingWindow;
if Result <> 0 then
Exit;
// may be comment this code

// fix Dax error : accessviolation (win2k, win xp)
ParkingName := 'DAXParkingWindow_' + Format('%p', [@ParkingWindowProc]);

FillChar(TempClass, sizeof(TempClass), 0);
if not GetClassInfo(HInstance, PChar(ParkingName), TempClass) then
// fix Dax error : accessviolation (win2k, win xp)
begin

TempClass.hInstance := HInstance;
TempClass.lpfnWndProc := @ParkingWindowProc;
TempClass.lpszClassName := PChar(ParkingName);
// fix Dax error : accessviolation (win2k, win xp)
if Windows.RegisterClass(TempClass) = 0 then

raise EOutOfResources.Create(SWindowClass);
end;

xParkingWindow := CreateWindowEx(WS_EX_TOOLWINDOW, TempClass.lpszClassName, nil,
WS_POPUP, GetSystemMetrics(SM_CXSCREEN) div 2,
GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil);
SetWindowPos(xParkingWindow, 0, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOREDRAW
or SWP_NOZORDER or SWP_SHOWWINDOW);
Result := xParkingWindow;
end;
 
谢谢您的回答.
我按照你上面的方法做了,把AxCtrls.pas里面的function ParkingWindow: HWND;改成这样了,打开多个IE页面,但还是会出这个错误啊.
DAX error : access violation at address 000
你那边测试了可以了是吧?
 
可以用代码在程序中实现COM的注册. 举例如下:
(假设需要注册的文件为test.ocx)
uses OLEctl,....
var
OCXHand: THandle;
RegFunc: TDllRegisterServer;
begin

OCXHand:= LoadLibrary('c:/windows/system/test.ocx');
RegFunc:= GetProcAddress(OCXHand, 'DllRegisterServer');

if RegFunc <> 0 then
ShowMessage('Error!');
FreeLibrary(OCXHand);
end;



olectl.pas在/source/rtl/win下.
 
我和你遇到是一样的问题 ocx 是debug的情况下没有任何问题,但是如果改成release就回出现问题也出现上面的错误
 
按理说这个问题是可以解决的,不然delphi开发ocx不是存在bug.
请大家多多帮忙!谢谢!
 
我修改了AxCtrls.pas文件,还是不行.
请问该如何解决这个问题呢?
 
千万不要用DELPHI开发OCX,DELPHI在这方面存在问题,直到现在的2007依然没有解决,看网上的帖子好像是说线程方面有问题,并且在目前的架构下很难解决。
 
后退
顶部