代码请看贴:http://expert.csdn.net/Expert/topic/2597/2597464.xml?temp=5.687892E-03
按照常规,如果过程或者函数的参数是string类型,那么就应该在单元文件中包含sharemem或者采用shortstring和pchar类型来传递。于是我对上面的代码做了修改,可是无论如何,调用过程执行完后关闭主程序就会出现堆栈错误,请问为什么?

解决方案 »

  1.   

    问题出在TempADO:=TADOQuery.create(nil)这句,我跟踪了一下,如果执行上4次以后就会出现堆栈错误。
      

  2.   

    算了我再贴一遍代码:
    {$R *.res}
     { procedure DllEnterPoint(dwReason: DWORD);far;stdcall;
      begin
        DLLProc := @DLLEnterPoint;
        DllEnterPoint(DLL_PROCESS_ATTACH);
        CoInitialize (nil);
      end;}
      procedure SelectRecord(Source,Target:TDBGridEh;ADOCon:TADOConnection;sqlstr,Key:PChar);stdcall;
      var
        i,j:integer;
        TempADO:TADOQuery;
      begin
        TempADO:=TADOQuery.Create(nil);
        with TempADO do
          begin
            Connection:=ADOCon;
            SQL.Clear;
            SQL.Add(sqlstr);
            Prepared;
            Open;
          end;
      try
      if Source.SelectedRows.Count>0 then
         with Source.DataSource.DataSet do
           for i:=0 to Source.SelectedRows.Count-1 do
             begin
               GotoBook(pointer(Source.SelectedRows.items[i]));
               if  not TempADO.Locate(Key,fieldbyname(Key).Value,[loCaseInsensitive]) then
                  begin
                     TempADO.Append;
                     for j:=0 to TempADO.FieldCount-1 do
                     TempADO.Fields[j].Value:=Fields[j].Value;;
                     TempADO.Post;
                  end else
                     messagebox(0,PChar('选择的纪录已经存在。'+#13+'主键  '+fieldbyname(key).AsString),PChar('提示'),MB_OK);
             end;
      finally
      TempADO.Active:=false;
      TempADO.Free;
      end;
      end;
    //导出过程函数
    exports
      SelectRecord index 1 name 'SelectRow';
    begin
    end.