类型转换问题invalid class typecast

q273584979 2013-04-10 10:48:51

断点位置报错 但是不知道怎么转换
谢谢
...全文
917 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
q273584979 2013-04-10
  • 打赏
  • 举报
回复
//调用dll
function Hk_GetDataList(var DBSP:TADOStoredProc;QryCon: Res_QryCondition;out PageCount: Integer;PageNum:Integer):String;stdcall;External 'HK_Dll.dll';
procedure TFrmCameraManager.QueryData;
var
  QryCon : Res_QryCondition ; {查询条件 结构体}
  DBSP: TADOStoredProc;
  c:string;
begin
  DBSP:=TADOStoredProc.Create(nil);
  c:=HK_GetDataList(DBSP,QryCon,PageCount,PageNum);
end;

//dll里的函数
function Hk_GetDataList(var DBSP:TADOStoredProc;QryCon: Res_QryCondition;out PageCount: Integer;PageNum:Integer):String;stdcall;
var
  db:TCameraManagerDBLayer;
  Ret : string;
begin
  db := TCameraManagerDBLayer.Create;
  Ret:= db.Hk_GetDataList(DBSP,QryCon,PageCount,PageNum);
  Result:=Ret;
  db.Free;
end;
function TCameraManagerDBLayer.Hk_GetDataList(var DBSP:TADOStoredProc;
  QryCon: Res_QryCondition;out PageCount: Integer;PageNum:Integer): String;
var
  TableName, PKey, Field, Condition, Order: String;
  RowCount:Integer;

  I:Integer;
  CostItems:array of TStringList;
  TitleNames:TStringArray;
  TitleWidth:TIntegerArray;
  Ret:String;
begin
//中间就调了这个方法
  OpenSQLPager(DBSP,TableName, PKey, Field, Condition, Order,PageNum,SysPageSize,PageCount, RowCount);
end;

function TDBOperation.OpenSQLPager(DBSP: TADOStoredProc;
  TableName, PKey, Field, Condition, Order: String; PageNum,
  PageSize: Integer; out PageCount, RowCount: Integer): Boolean;
var
  DBQry: TADOQuery;
  Ret:Boolean;
begin
  Ret:=False;
  DBQry:=TADOQuery.Create(nil);
try
  try
    DBSP.Connection:=DBConn;
    DBQry.Connection:=DBConn;
    DBSP.CommandTimeout:=0;
    DBQry.CommandTimeout:=0;
    
    DBSP.Close;
    DBSP.ProcedureName:='GetRecordByPage';
    DBSP.Parameters.CreateParameter('@sTable',ftstring,pdinput,100,TableName);
    DBSP.Parameters.CreateParameter('@sPkey',ftstring,pdinput,50,PKey);
    DBSP.Parameters.CreateParameter('@sField',ftstring,pdinput,1000,Field);
    DBSP.Parameters.CreateParameter('@iPageCurr',ftinteger,pdinput,4,PageNum);
    DBSP.Parameters.CreateParameter('@iPageSize',ftinteger,pdinput,4,PageSize);
    DBSP.Parameters.CreateParameter('@sCondition',ftstring,pdinput,1000,Condition);
    DBSP.Parameters.CreateParameter('@sOrder',ftstring,pdinput,100,Order);

    DBSP.Open;

    DBQry.Close;
    DBQry.SQL.Clear;
    DBQry.SQL.Add('Select Count(*) as RecCount from '+TableName+' Where '+Condition);
    DBQry.Open;

    RowCount:=DBQry.FieldByName('RecCount').AsInteger;
    PageCount:= (RowCount div PageSize)+1;

    Ret:=True;
  finally
    DBQry.Free;
  end;
except
  Ret:=False;
end;
  Result:=Ret;
end;
到上面的位置就说无效。
q273584979 2013-04-10
  • 打赏
  • 举报
回复
引用 3 楼 feiba7288 的回复:
参考下这个:http://zhidao.baidu.com/question/320230467.html
之前是好用的 但是现在想给封成dll 就报这个错。。
feiba7288 2013-04-10
  • 打赏
  • 举报
回复
feiba7288 2013-04-10
  • 打赏
  • 举报
回复
用上面的函数和下面的代码试下 ADOQuery1.Parameters.CreateParameter('@sTable', fsString, pdInput, 100, StringToVariantArray(TableName))
feiba7288 2013-04-10
  • 打赏
  • 举报
回复
String转为OleVariant用下面这个函数

function StringToVariantArray(const S: string): OleVariant;
var
  P: Pointer;
begin
  Result := NULL;
  if Length(S) > 0 then
  begin
    Result := VarArrayCreate([0, Length(S) - 1], varByte);
    P := VarArrayLock(Result);
    try
      Move(S[1], P^, Length(S));
    finally
      VarArrayUnlock(Result);
    end;
  end;
end
sololie 2013-04-10
  • 打赏
  • 举报
回复
如果不是老板死催你,看书吧,《Delphi6 开发人员指南》《深入核心VCL架构剖析》。。。
q273584979 2013-04-10
  • 打赏
  • 举报
回复
引用 8 楼 sololie 的回复:
不行,tstringlist里面保存的就是一个个的string。 你还是用包bpl吧,你这样搞以后还的继续发10几20个这类问题的贴。你要是真心想解决问题,就耐下性子看看书,如果是只想解决问题交差了事,那就用bpl或者别封装成dll了。
网上查了 做bpl 都看不懂 有没有好点的教程 谢谢
sololie 2013-04-10
  • 打赏
  • 举报
回复
不行,tstringlist里面保存的就是一个个的string。 你还是用包bpl吧,你这样搞以后还的继续发10几20个这类问题的贴。你要是真心想解决问题,就耐下性子看看书,如果是只想解决问题交差了事,那就用bpl或者别封装成dll了。
q273584979 2013-04-10
  • 打赏
  • 举报
回复
引用 6 楼 sololie 的回复:
建立每个DLL项目时,这一大串蚂蚁你从来无视吗: { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source)……
返回Tstringlist行吗
sololie 2013-04-10
  • 打赏
  • 举报
回复
建立每个DLL项目时,这一大串蚂蚁你从来无视吗: { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } 我也见过好几人都跟你讲过了,讲了又讲的。DLL中不要使用string、动态数组,如果要用就得双向引入sharemem,但是这样你的DLL就不能被delphi之外的程序使用,如果这样不如就用bpl。 另外DLL中处理VCL类型需要注意很多事情,除非你对这些需要注意的事情很有把握,否则不要在DLL中 使用VCL。你要去看看书中讲到delphi 关于DLL封装的章节。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧