我遇到的“灾难性故障”这个问题有点奇怪,
我调用一次接口函数没有问题,,第二次调用同样一个接口函数(这里的第二次调用不是下面代码中的那个第二调用),就出现问题了,,
这个“灾难性故障”跟COM对象的实例形式有关系吗?
还有我在COM服务端,有些个接口跟Word 的多文档方式差不多,就是需要有多个相同的接口, 实际上我是用一个 TList 来保存接口,但是问题比较多,不知道我的方式对不对?
var
i, sum: integer;
tmp: IArea;
begin
///////////////////////////////////////////////
// 检查可用的显示区域。。
sum := 0;
for i := 0 to FAreaList.Count -1 do // 第一次加入没有问题,第二次 AddArea
// 时,, FAreaList.Items 是有效的地址值,强制转换成
// IArea 时老出错,反映到客户端时就是“灾难性故障”
// 后来我把 FAreaList 改成 array of IArea 后修改相应的代码
// 这里不会出错了,但是调用其它的接口函数,比如后面的
begin
sum := sum + IArea(FAreaList.Items).Size;
end;
// 保证加入的显示区域在屏体有效范围内。
ACol := Min(ACol, FColCount - sum);
//////////////////////////////////////////////
if ACol <= 0 then
raise EDispAreaError.Create('没有可用的显示区分配空间');
///////////////////
// 在所有显示区的最末加入显示区。
tmp := TArea.Create(self, Get_AreaCount);
tmp.Size := ACol;
tmp.Start := sum + COL_START;
tmp.Size := ACol;
FAreaList.Add(TArea(tmp));
Result := tmp;
end;
下面这个过程是在修改成 FArealist 成 array of IArea ,上一个函数正常后,调用像下面这样的接口老是在第一次调用正常后,再调用就出现“灾难性故障”
function TLEDTPSvr.StopShow: Integer;
var
cTmp: PChar;
strTmp: string;
len: integer;
begin
FCmdMaker.Command := CMD_STOP;
strTmp := FCmdMaker.Output;
len := Length(strTmp);
GetMem(cTmp, len);
Move(PChar(strTmp)^, PChar(cTmp)^, len);
result := FSender.SendData(cTmp, len);
end;
基本的东西,了解得不是很透彻,现在遇到这样子的问题都不知道该怎么来做了,:O
还有我的这个COM Server 是"In-process"类型的,该怎么来调试啊?我现在是只有加 Showmessage 来看,加看来的结果是在调用结束后,返回的过程中出现的错误。。
………………