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的参数,也没有错误出现。
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,否则应该不行。
VCL对象实际就是地址啦,所以,在DLL传,基本上都应该出错。建议你把这段代码放到exe中,或者用Package,否则应该不行。
#9
在library里
uses了 ActiveX
begin里写了
CoInitialize(nil);
end;
我已经这样作了,还是有指针的问题。
uses了 ActiveX
begin里写了
CoInitialize(nil);
end;
我已经这样作了,还是有指针的问题。
#10
cn: TADOConnection; AsBar:TStatusBar
声明的时候前面加Var
并且有些VCL控件不能传入DLL,否则要出错
声明的时候前面加Var
并且有些VCL控件不能传入DLL,否则要出错
#11
把过程的参数前加上var保证是传值进去!试一试。
#12
加入ShareMem试试, SetStatusBar好象没错。
chechy的说法有点问题,VCL是可以使用的。只是在作为参数的时候要慎重
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的参数,也没有错误出现。
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,否则应该不行。
VCL对象实际就是地址啦,所以,在DLL传,基本上都应该出错。建议你把这段代码放到exe中,或者用Package,否则应该不行。
#9
在library里
uses了 ActiveX
begin里写了
CoInitialize(nil);
end;
我已经这样作了,还是有指针的问题。
uses了 ActiveX
begin里写了
CoInitialize(nil);
end;
我已经这样作了,还是有指针的问题。
#10
cn: TADOConnection; AsBar:TStatusBar
声明的时候前面加Var
并且有些VCL控件不能传入DLL,否则要出错
声明的时候前面加Var
并且有些VCL控件不能传入DLL,否则要出错
#11
把过程的参数前加上var保证是传值进去!试一试。
#12
加入ShareMem试试, SetStatusBar好象没错。
chechy的说法有点问题,VCL是可以使用的。只是在作为参数的时候要慎重
chechy的说法有点问题,VCL是可以使用的。只是在作为参数的时候要慎重
#13
ShareMem 同事也过告诉我加的,我已经加过了,
#14
我试试没问题,无论是静态连接还是动态,不是传的参数有问题吧,dll中要包含ComCtrls