以下是我在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;

解决方案 »

  1.   

    CoInitialize(nil);初始化com時機不對,可以寫在單元初始化段initialization,在finalization再un...
      

  2.   

    这段代码是直接卸载dll工程里的,没有單元初始化段initialization,,,,,
      

  3.   

    这段代码是直接写在dll工程里的,没有單元初始化段initialization,,,,,
      

  4.   

    用exitproc或者dllproc變量來進行初始化;你也可以新建一個unit,來利用它的ini.....
    利用exitproc,如下:
      library MyDLL;
      ...
      OldExitProc: pointer;
      ...
      procedure MyExitProc;
      begin
      ... //善后程序
      ExitProc := OldExitProc;
      end;
      ...
      begin
      ... //初始化程序
      OldExitProc := ExitProc;
      ExitProc := @MyExitProc;
      end.
      

  5.   

    Privileged Instruction 非法执行特权指令
    1.可能在你的 DLL 中有 I/O 的指令(EX: inp or outp)
    2.使用了AdoQuery的FindKey
      

  6.   

    用到Table或Query的FindKey或在程式中使用到组合语言
    都会造成错误:Privileged instruction 若是用了I/O指令,则要
    out和in汇编指令在Window2000以上Ring3(普通级别)不能再使用,如果要使用,必须进入Ring0指令级别(操作系统级),驱动程序工作在Ring0级别下.
      

  7.   

    findkey是什么意思?抱歉不太明白,我使用AdoQuery做的也就是一个普通的查询,