大家帮我看看这两个三层问题------Variant参数传递的问题
如果解决不了我就得换开发工具了---换delphi或者vc.net
下面的问题的运行环境:Windows2000专业版、
BCB5专业版+BCB5ADOUpgrade1.exe+BCB5EntUpdate1.exe
MS SQL SERVER7.0
问题1:客户端执行服务器端方法的问题
服务器端程序:
STDMETHODIMP TDynamicSQLDemoImpl::AAAA(BSTR ABC)
{
__try
{
AnsiString abcd="luhongjun "+AnsiString(ABC);
Application->MessageBox(abcd.c_str(), NULL, MB_OK);
}
__finally
{
return S_OK;
}
}
//----------------------------------------------------------------------------------------
STDMETHODIMP TDynamicSQLDemoImpl::GetAllTables(TVariant* vTables)
{
__try
{
TStringList *tblList=new TStringList();
DynamicSQLDemo->adocDSQL->GetTableNames(tblList, false);
int Bounds[2] = {0,tblList->Count};
vTables=VarArrayCreate(Bounds,1,varVariant);
for (int i=0;i<tblList->Count;i++)
{
//vTables.PutElement(tblList->Strings[i],i); // 编译无法通过,直接定义Variant* vTables可以通过
vTables[i]=tblList->Strings[i];
}
Application->MessageBox("aaaaa","11",MB_OK) ; //测试,如果远程调用,并不执行
delete tblList ;
}
__finally
{
return S_OK;
}
}
客户端程序:
void __fastcall TForm1::AAAAClick(TObject *Sender)
{
//客户程序1
Variant vtblList;
if (!SocketConnection1->Connected)
SocketConnection1->Connected=true;
IDispatch* disp = (IDispatch*)(SocketConnection1->AppServer);
IDynamicSQLDemoDisp DynamicSQLDemo( (IDynamicSQLDemo*)disp);
DynamicSQLDemo.AAAA(WideString("This is a TEST"));
}
//-------------------------------------------------------------
void __fastcall TForm1::GetAllTablesClick(TObject *Sender)
{
//客户程序2
Variant vtblList;
if (!SocketConnection1->Connected)
SocketConnection1->Connected=true;
IDispatch* disp = (IDispatch*)(SocketConnection1->AppServer);
IDynamicSQLDemoDisp DynamicSQLDemo( (IDynamicSQLDemo*)disp);
DynamicSQLDemo.GetAllTables(vtblList);
if (VarIsArray(vtblList))
{
ListBox1->Items->Add("vtblList is Array");
for (int i=VarArrayLowBound(vtblList,1);i<VarArrayHighBound(vtblList,1);i++)
ListBox1->Items->Add(vtblList.GetElement(i));
}
else
ListBox1->Items->Add("vtblList is not Array");
}
问题:
在上面的程序中,“客户程序1”被执行的时候,服务器端正常显示“luhongjun This is a TEST”对对话框。但“客户程序2”被执行的时候服务段没有任何反映既Application->MessageBox("aaaaa","11",MB_OK) ;都不能被执行,在客户端列表框中提示:vtblList is not Array,说明服务器端的GetAllTables根本就没有被执行,但此例子在Delphi5.0下就好用。
请问:这是为什么,此问题已经困绕我好长时间了,是否是BCB5的BUG。
问题2:用ClientDataSet的集合(Aggregates)属性出现的问题。
在我的系统中ClientDataSet的Aggregates属性已经增加了Sum项
在程序中调用ClientDataSet->Aggregates->Items[0]->Value编译出现问题,提示为:Member function Must be Called or its address taken。但在Delphi5中调用正常。