DLL内使用全局变量问题(50分)

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

liboyang_bj

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在DLL内使用全局变量,是一个类的实例。
在DLL被调用时这个全局变量就生成,以便所有的函数和过程都能使用这个变量。比如访问属性,调用方法一类的操作。
请问我改如何编写。
在DLL被释放时我需要销毁这个变量么?
谢谢!
 
我也遇到相同问题:主窗体里调用BPL里的类生成的窗体里的事件无法操作主窗体的属性。
报内存错误。
 
我也有这样的问题:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1223221
我把一个treeview传到dll中,在dll这为treeview添加node,但是一用clear方法清除
这些node,就出错
Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'.Process stopped.Use Step or Run to continue.
 
要用到内存映射的东西
CreateFileMapping
MapViewOfFile
 
你做个自动化组件不就行了。要不得一般的引出初始化函数,卸载函数。
或者在DLLPROC里写创建和释放,都很容易出错。
 
在DLL中使用全局变量,就在DLL工程的一个单元中的的Initialize 和 finatialize里
分别创建和释放就可以了啊,
 
to dollar:
你的意思是否是在dll工程中uses一个单元,然后在那个被uses的单元的Initialize 和
finatialize里分别创建和释放,这样,dll在初始化时,被uses的单元的Initialize部分
就会被执行,而在dll卸载时,被uses的单元的finatialize部分就会被执行。

是这样理解的吗?那么,如果这个dll工程有多个单元,那是否每个单元的Initialize 和
finatialize部分都会有这个过程?
 
这是一个delphi5开发人员指南的例子
function InitStrConvert(APrepend, AAppend: String): TStringConvert
stdcall;

implementation

constructor TStringConvert.Create(APrepend, AAppend: String);
begin
inherited Create;
FPrepend := APrepend;
FAppend := AAppend;
end;

destructor TStringConvert.Destroy;
begin
inherited Destroy;
end;

function TStringConvert.ConvertString(AConvertType: TConvertType
AString: String): String;
begin
case AConvertType of
ctUpper: Result := Format('%s%s%s', [FPrepend, UpperCase(AString), FAppend]);
ctLower: Result := Format('%s%s%s', [FPrepend, LowerCase(AString), FAppend]);
end;
end;

function InitStrConvert(APrepend, AAppend: String): TStringConvert;
begin
Result := TStringConvert.Create(APrepend, AAppend);
end;
function InitStrConvert(APrepend, AAppend: String): TStringConvert
stdcall;
external 'STRINGCONVERTLIB.DLL';

implementation

{$R *.DFM}

procedure TMainForm.btnUpperClick(Sender: TObject);
var
ConvStr: String;
FStrConvert: TStringConvert;
begin
FStrConvert := InitStrConvert('Upper ', ' end');
try
ConvStr := edtConvertStr.Text;
if ConvStr <> EmptyStr then
edtConvertStr.Text := FStrConvert.ConvertString(ctUpper, ConvStr);
finally
FStrConvert.Free;
end;
end;

procedure TMainForm.btnLowerClick(Sender: TObject);
var
ConvStr: String;
FStrConvert: TStringConvert;
begin
FStrConvert := InitStrConvert('Lower ', ' end');
try
ConvStr := edtConvertStr.Text;
if ConvStr <> EmptyStr then
edtConvertStr.Text := FStrConvert.ConvertString(ctLower, ConvStr);
finally
FStrConvert.Free;
end;
end;
 
To dirk:
你理解的没错,不过当然不用工程中的每个单元都有,只要保证有一个就行了,
否则,反而会执行多遍,就不对了。
 
多谢,我知道了!
 
顶部