以下是我在DLL中写得一个函数,作用是把客户名称加到下拉框中,同时用一个TStringList记录对应的客户编码。
在主程序中调用这个函数时,出现错误提示:Privileged instructionprocedure AddKH(cbxKHMC:TComboBox;khbmList:TStringList);
var
i:integer;
begin
CoInitialize(nil);
cbxKHMC.Clear;
khbmList := TStringList.Create;
dmMain := TdmMain.Create(nil);//dmMain是我建的一个DataMoudle,上面有一个AdoConnection,一个AdoQuery
with dmMain do
begin
AdoConnection.Close;
AdoConnection.ConnectionString := SetServer;
with qryMain do
begin
Sql.Clear;
Sql.Add('select * from t_0501');
ExecSQL;
Open;
for i:=1 to RecordCount do
begin
cbxKHMC.Items.Add(FieldByName('KHMC').AsString);
khbmList.Add(FieldByName('KHBM').AsString);
Next;
end;
end;
end;
end;
在主程序中调用这个函数时,出现错误提示:Privileged instructionprocedure AddKH(cbxKHMC:TComboBox;khbmList:TStringList);
var
i:integer;
begin
CoInitialize(nil);
cbxKHMC.Clear;
khbmList := TStringList.Create;
dmMain := TdmMain.Create(nil);//dmMain是我建的一个DataMoudle,上面有一个AdoConnection,一个AdoQuery
with dmMain do
begin
AdoConnection.Close;
AdoConnection.ConnectionString := SetServer;
with qryMain do
begin
Sql.Clear;
Sql.Add('select * from t_0501');
ExecSQL;
Open;
for i:=1 to RecordCount do
begin
cbxKHMC.Items.Add(FieldByName('KHMC').AsString);
khbmList.Add(FieldByName('KHBM').AsString);
Next;
end;
end;
end;
end;
利用exitproc,如下:
library MyDLL;
...
OldExitProc: pointer;
...
procedure MyExitProc;
begin
... //善后程序
ExitProc := OldExitProc;
end;
...
begin
... //初始化程序
OldExitProc := ExitProc;
ExitProc := @MyExitProc;
end.
1.可能在你的 DLL 中有 I/O 的指令(EX: inp or outp)
2.使用了AdoQuery的FindKey
都会造成错误:Privileged instruction 若是用了I/O指令,则要
out和in汇编指令在Window2000以上Ring3(普通级别)不能再使用,如果要使用,必须进入Ring0指令级别(操作系统级),驱动程序工作在Ring0级别下.