288分求救(图个吉利) 谁能给我个在MIDAS中客户端调用中间层的函数的例子(要C++Builder的)(288分)

葬月

Unregistered / Unconfirmed
GUEST, unregistred user!
比方说在中间层有这么个函数 MyFun( 参数1,参数2,参数3)
参数1是个字符串类型 要求值能够返回
参数2是个 int * ,要求值能够返回
参数3是个自定义结构 也要求值能够返回
当我在做这的时候,发现许多问题
在 Type Library里在远程数据模块不知道如何定义让参数能够返回 int,
里面没有int * 的类型
我也不知道如何传递个自定义结构
不知道如何利用 Variant来返回个int 或 char
在客户端我也不知道如何调用,似乎和Delphi不一样
请问如何调用,要加什么头文件到客户端?
请高手一步一步的教我
我用的是 DCOM C++Builder6.0
 
CB中的实际例子,应用服务器CwSever 函数Login
TVariant dat,name;
ICwServerDisp CwServer((ICwServer*)(IDispatch*)DM->DCOM->AppServer);
CwServer.Login(WideString(sCode),WideString(sKey),&name,&dat);
 
我使用过,调通了,又放弃了,再三层中利用函数有很多限制。
你最好说说想干什么。
 
就是想传递几个参数,然后返回几个参数
比方说 服务端的那个函数Get( String str,int * tt)
int i
我在客户端要调用 ("asdvasc",&i)
就那么简单
 
听听,我还没用过midas呢。
谁来讲讲dcom ,midas,web server的区别
 
按照生命如歌的说法
我在服务端的函数是这样的
STDMETHODIMP TMyTextImpl::IsHasUser(unsigned_char UserName,
VARIANT* Result)
{
ShowMessage("Success");
//这个出现的
Result->intVal=1;
}
在客户端我
IMyTextDisp t;
TVariant r;
t.Bind(MainForm->m_DCOMConnection->GetServer() );
t->IsHasUser((unsigned char)("Administrator"),&r);
ShowMessage( IntToStr( (int)r));
问题是 r 着时候却是个0
怎么回事?
 
客户端定义一个整数
TVariant r;
int n;
n = r;
后 n 就有了
 
没有用啊 生命如歌
IMyTextDisp t;
TVariant r;
int i;
//VARIANT * r;
t.Bind(MainForm->m_DCOMConnection->GetServer() );
t->IsHasUser((unsigned char)("Administrator"),&r);
i=r;
ShowMessage( IntToStr( i));

还是等于0
 
服务器端赋值改成
STDMETHODIMP TMyTextImpl::IsHasUser(unsigned_char UserName,
VARIANT* Result)
{
ShowMessage("Success");
//这个出现的
*Result = 1;
}
 
客户端
String s1,s2,s3;
Variant str1,str2,str3;
IDispatch* disp = (IDispatch*)(Data1->SocketConnection1->AppServer);
IwjglSvrDisp Svr((IwjglSvr*)disp);
Svr.GetSvrInfo(str1,str2,str3);
s1 = String(str1);
s2 = String(str2);
我客户端用的 SocketConnection1 联接服务器端。
服务器端
STDMETHODIMP TwjglSvrImpl::GetSvrInfo(TVariant* Str1, TVariant* Str2,
TVariant* Str3)
{
String user,name,pass;
user = *Str1;
name = *Str2;
pass = *Str3;
//一些针对 user1 name pass 的操作
*Str1 = "操作状态:";
*Str2 = "成功";
return S_OK;
}
其中接口 : IwjglSvr
方法 : GetSvrInfo
 
生命之歌
程序说不能把 int 转换为 variant
askall 你怎么把TVariant*加进去的?
在Type Library 好像没有TVariant*这个类型让你加啊
 
int *i;
*i=1;
Result=(VARIANT*)i;
就是这样也不行
 
为什么要这样
int *i;
*i=1;
Result=(VARIANT*)i;
服务器端 改成 *Result = 1;就行了噻,我做的正在用,肯定没问题的
 
但是那样程序说 不能把 int 转换为 tagVARIANT
我的是CB6.0 这有关系吗?
 
我现在这样倒可以运行了
Variant t;
t=1;
*R=t;
真奇怪
我按照VARIANT查询C++Builder的帮助
查出来的例子却是Variant 按照Variant 才会有那样的错误
 
天哪.又出现新问题了
我加了几行代码,服务端却不执行?
STDMETHODIMP TMyTextImpl::IsHasUser(unsigned_char UserName, VARIANT* R)
{
MessageBox(0,"0","0",MB_OK);
//当我在客户端调用的时候 这个对话框出得来
MyText->Sql_ADOQuery->Close();
MessageBox(0,"1","1",MB_OK);
//但是这个对话框却出不来
//似乎下面的语句根本就没有执行
//为什么????
MyText->Sql_ADOQuery->Connection=MyText->Main_ADOConnection;
MyText->Sql_ADOQuery->SQL->Clear();
String name=UserName;
MyText->Sql_ADOQuery->SQL->Add("Select * from Power");
MyText->Sql_ADOQuery->Open();
bool r;
TLocateOptions Opts;
Opts.Clear();
Opts << loPartialKey;
r=MyText->Sql_ADOQuery->Locate("用户名",name,Opts);
MyText->Sql_ADOQuery->Close();
//以上代码只是寻找UserName这个值数据库里是否有
Variant t;
t=r;
if(r)
MessageBox(0,"true","",MB_OK);
else
MessageBox(0,"false","",MB_OK);
//按理说这里无论如何也会出来个对话框
*R=t;
}
 
天,你那288分要把MIDAS学完了
 
什么呀
我只不过想用C++Builder调用中间层的接口方法
但是现在出现那么多的问题
有什么很稳定肯定能够实现的方法呢???
我现在苦死了
服务端写的接口
在客户端竟然不能用
 
葬月:
看看我的回答,我奉劝你,调通之后就放弃这种方法吧。你还会遇到更多莫名其妙的问题。
任何事情都有变通,midas自带的事件足以满足编程要求。
你新问题的解决办法:
新建一个datamoudle,不是remotedatamoudle,把你的adoquery放进去,一定能执行。
 
那我怎么调用中间层的方法??
我现在
ITextServerDisp t((ITextServer*)(IDispatch*)MainForm->m_DCOMConnection->AppServer);
t->IsHasUser((unsigned char)("Administrator"),&amp;r);
这里说t里面竟然没有 IsHasUser这个成员函数
太奇怪了
服务端要把什么头文件加到客户端里才行吗?
我只加了个 **** tlb.h
 
顶部