一个分布式的小数据库程序(DCOM) DCOM服务程序导出三个方法,1个成功2个失败,不知道为什么?
#include <vcl.h>
#pragma hdrstop
#include "MULTICOMPANYDATAIMPL.H"
#if !defined(__PRAGMA_SMART_INIT_DEFINED)
#define __PRAGMA_SMART_INIT_DEFINED
#pragma package(smart_init)
#endif
#pragma resource "*.dfm"
/////////////////////////////////////////////////////////////////////////////
// Global instance of TMultiCompanyDataImpl
/////////////////////////////////////////////////////////////////////////////
TMultiCompanyData *MultiCompanyData;这个是一个REmote数据模块
/////////////////////////////////////////////////////////////////////////////
// TMultiCompanyData::TMultiCompanyData
/////////////////////////////////////////////////////////////////////////////
__fastcall TMultiCompanyData::TMultiCompanyData(TComponent* Owner) : TCRemoteDataModule(Owner)
{
}
STDMETHODIMP TMultiCompanyDataImpl::InsertDataRecord(BSTR Name,
BSTR Captial, BSTR Continent, BSTR Area, BSTR Population)
{
try
{
Form1->InsertDataRecord(Name,Captial,Continent,Area,Population);
}
catch(Exception &E)
{
return Error(E.Message.c_str(),IID_IMultiCompanyData );
}
return S_OK;
}
STDMETHODIMP TMultiCompanyDataImpl::RefreshDataRecord()
{
try
{
Form1->RefreshDataRecord();
}
catch(Exception &E)
{
return Error(E.Message.c_str(),IID_IMultiCompanyData );
}
return S_OK;
}
STDMETHODIMP TMultiCompanyDataImpl::TestCall(BSTR* AName)
{
try
{
AnsiString S="hello world";
*AName =WideString(S);
}
catch(Exception &E)
{
return Error(E.Message.c_str(),IID_IMultiCompanyData );
}
return S_OK;
}
STDMETHODIMP TMultiCompanyDataImpl::GetFirstField(BSTR* Name)
{
try
{
if(!MultiCompanyData->Table1->Active)
MultiCompanyData->Table1->Open();
*Name =WideString(MultiCompanyData->Table1->Fields->Fields[0]->FieldName);
}
catch(Exception &E)
{
return Error(E.Message.c_str(),IID_IMultiCompanyData );
}
return S_OK;
}
各个函数的具体实现如下:
/////////////////////////////////////////////////////////////////////////////////////////
void __fastcall TForm1::RefreshDataRecord()
{
MultiCompanyData->Table1->Close();
MultiCompanyData->Table1->Open();
}
void __fastcall TForm1::InsertDataRecord(AnsiString Name,AnsiString Captial,
AnsiString Area, AnsiString Continent, AnsiString Population)
{
try
{
MultiCompanyData->Table1->Insert();
MultiCompanyData->Table1->Fields->Fields[0]->Value=Name;
MultiCompanyData->Table1->Fields->Fields[0]->Value=Captial;
MultiCompanyData->Table1->Fields->Fields[0]->Value=Area;
MultiCompanyData->Table1->Fields->Fields[0]->Value=Continent;
MultiCompanyData->Table1->Fields->Fields[0]->Value=Population;
MultiCompanyData->Table1->Post();
RefreshDataRecord();
ShowMessage("SUCCEED IN INSERTING RECORD !");
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
以下为客户程序的调用导出方法的代码,但只有Testcall可以成功,GetFirstField返回空字串。。最后那个发EAcessAoscction消息框
////////////////////////////////////////////////////////////////////////////////////////////
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
CoInitialize(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
WideString S;
WideString S2;
TCOMIMultiCompanyData ComServer=CoMultiCompanyData::Create();
//测试服务器连接
ComServer->TestCall(&S);
ShowMessage(S);
//测试方法1
ComServer->GetFirstField(&S2);
ShowMessage(S2);
//测试方法2
//ComServer->InsertDataRecord(WideString(Edit1->Text),WideString(Edit2->Text),WideString(Edit3->Text),WideString(Edit4->Text),WideString(Edit5->Text));
}
//---------------------------------------------------------------------------
以下为客户程序的调用导出方法的代码,但只有Testcall可以成功,GetFirstField返回空字串。。最后那个发EAcessAoscction消息框
不知道,为什么包含数据模块的代码,或者包含窗体里面的函数的方法导出调用就不成功,请高手解决,谢谢。。。。。。。
QQ:462511021
Email:jxw1987628@163.com