动态链接库里经常出现无效的指针操作???

时间:2023-01-16 15:47:01
我刚刚应用动态链接库,经常出现无效的指针操作,经常有这样的错误提示。我问了几个同事,还是没有解决。谁有过这样的经历,给指点一下,什么情况下容易出现这样的问题,怎么解决。多谢了。

14 个解决方案

#1


如果dll没有问题的吧,那么通常是函数声明不对,基本上应该是函数压栈的方式没有声明对,Delphi默认的是register,Windows通常是stdcall,而C系列默认的是cdecl

#2


我用的是stdcall,我看书上都是这么写的。

#3


听课

#4


如果你用Delphi写Dll,不要将String或动态数组这些类型作为Dll中某个函数的参数类型。否则就会出现无效的Pointer。

#5


你传递的是什么?讲讲看?

#6


procedure SetStatusBar(cn: TADOConnection; AsBar:TStatusBar);stdcall;
var
pnl: TStatusPanel;
begin
try
if Assigned(cn) and Assigned(AsBar) then
begin
AsBar.Panels.Clear;
pnl := AsBar.Panels.Add;
pnl.Width := 200;
pnl.Alignment := taCenter;
pnl.Text := 'ABC';

pnl := Asbar.Panels.Add;
pnl.Width := 150;
pnl.Alignment := taCenter;
pnl.Text := 'BCD';
end;
except 
end;
end;
这是我写在DLL里面的一个过程, 调用这个过程时,总在AsBar.Panels.Clear;这总有指针错误。不知道为什么???
其它也有用STRING的参数,也没有错误出现。

#7


用到控件,初始化运行环境了吗?

#8


我个人认为,在DLL中传递VCL对象是不可取的。因为DLL和EXE实际上是用了两块不同的内存,而不是在同一块内存当中,所以,在exe中的地址和dll中的地址,是无法等同的。
VCL对象实际就是地址啦,所以,在DLL传,基本上都应该出错。建议你把这段代码放到exe中,或者用Package,否则应该不行。

#9


在library里
uses了 ActiveX

begin里写了
  CoInitialize(nil);
end;
我已经这样作了,还是有指针的问题。

#10


cn: TADOConnection; AsBar:TStatusBar
声明的时候前面加Var
并且有些VCL控件不能传入DLL,否则要出错

#11


把过程的参数前加上var保证是传值进去!试一试。

#12


加入ShareMem试试, SetStatusBar好象没错。

chechy的说法有点问题,VCL是可以使用的。只是在作为参数的时候要慎重

#13


ShareMem 同事也过告诉我加的,我已经加过了,

#14


我试试没问题,无论是静态连接还是动态,不是传的参数有问题吧,dll中要包含ComCtrls

#1


如果dll没有问题的吧,那么通常是函数声明不对,基本上应该是函数压栈的方式没有声明对,Delphi默认的是register,Windows通常是stdcall,而C系列默认的是cdecl

#2


我用的是stdcall,我看书上都是这么写的。

#3


听课

#4


如果你用Delphi写Dll,不要将String或动态数组这些类型作为Dll中某个函数的参数类型。否则就会出现无效的Pointer。

#5


你传递的是什么?讲讲看?

#6


procedure SetStatusBar(cn: TADOConnection; AsBar:TStatusBar);stdcall;
var
pnl: TStatusPanel;
begin
try
if Assigned(cn) and Assigned(AsBar) then
begin
AsBar.Panels.Clear;
pnl := AsBar.Panels.Add;
pnl.Width := 200;
pnl.Alignment := taCenter;
pnl.Text := 'ABC';

pnl := Asbar.Panels.Add;
pnl.Width := 150;
pnl.Alignment := taCenter;
pnl.Text := 'BCD';
end;
except 
end;
end;
这是我写在DLL里面的一个过程, 调用这个过程时,总在AsBar.Panels.Clear;这总有指针错误。不知道为什么???
其它也有用STRING的参数,也没有错误出现。

#7


用到控件,初始化运行环境了吗?

#8


我个人认为,在DLL中传递VCL对象是不可取的。因为DLL和EXE实际上是用了两块不同的内存,而不是在同一块内存当中,所以,在exe中的地址和dll中的地址,是无法等同的。
VCL对象实际就是地址啦,所以,在DLL传,基本上都应该出错。建议你把这段代码放到exe中,或者用Package,否则应该不行。

#9


在library里
uses了 ActiveX

begin里写了
  CoInitialize(nil);
end;
我已经这样作了,还是有指针的问题。

#10


cn: TADOConnection; AsBar:TStatusBar
声明的时候前面加Var
并且有些VCL控件不能传入DLL,否则要出错

#11


把过程的参数前加上var保证是传值进去!试一试。

#12


加入ShareMem试试, SetStatusBar好象没错。

chechy的说法有点问题,VCL是可以使用的。只是在作为参数的时候要慎重

#13


ShareMem 同事也过告诉我加的,我已经加过了,

#14


我试试没问题,无论是静态连接还是动态,不是传的参数有问题吧,dll中要包含ComCtrls