关于com组件的接口参数及返回值数据类型问题,100分送上!!(100分)

  • 主题发起人 主题发起人 iamwbq
  • 开始时间 开始时间
I

iamwbq

Unregistered / Unconfirmed
GUEST, unregistred user!
com组件编写中对于接口数据类型应该怎么样来设置,比如,我想要返回的是字符串型
的数据,该把返回类型或者参数类型设成什么呢?我试了Isting*及lpstr都不行,都没法
在调用程序端使用。还有其它其它的数据类型又该如何呢??
 
返回值 一定是 XXXX * (out, retval)/(out)
多观察一下Type library Editor
 
还是不太明白,这位仁兄可否详加指教!!
我试过把返回类型设为olevariant到是可以,再就是Type library Editor我用了,
但还是不很明白,小弟这部分初学,万望各位不吝指教!!
 
olevariant 可以解决问题
字符串可以声明成 widestring (bstr)

用Delphi COM/DCOM 入门容易
深入的要仔细研究了,我也不是很懂
建议看一看 MS 的 Inside COM
 
首先你得了解COM和IDL,这些知识在MSDN上有。给出一行例子,是MIDL的格式。
HRESULT SomeFunction([in] BSTR strParam,[out,retval] BSTR *pReturnVal);
~~~~~~~ ~~ ~~~~~~~~~~~ ~~~~~~~~~~~
接口函数 输入参数 输出参数当做 输出参数一定是指针
的返回值 为BSTR类型 此方法的返回值
只能是
HRESULT

这样一个声明在调用时是这样的:
var str:WideString;
begin
str = SomeInterface.SomeFunction('输入参数');
……………

 
输出参数怎样被设成指针类型呢?
HRESULT SomeFunction([in] BSTR strParam,[out,retval] BSTR *pReturnVal);
这段代码中,我怎么没法生成最后的BSTR *pReturnVal,还望祥加指教,谢谢了!
 
在Delphi的TypeEditor中是这样声明的:(在设定参数类型时选择BSTR *,双击Modifier栏,选择Out ,RetVal两项)
HRESULT _stdcall SomeFunction([in] BSTR strParam, [out, retval] BSTR * pReturnValue );

实现则是:
function ISomeInterface.SomeMethod(const strParam: WideString;
out pReturnValue: WideString): HResult;
begin
...................
pReturnValue = '输入参数为:'+strParam;
.............
end;
 
而且,如果写成这样:
HRESULT _stdcall Method1([in] BSTR pa1, [out, retval] VARIANT * pa2 );
调用写成这样:
procedure TForm1.Button1Click(Sender: TObject);
var
str:widestring;
begin
str=n1.Method1(edit1.text)
end;
系统提示,参数不够
但要是写成这样:n1.Method1(edit1.text,str);
procedure TForm1.Button1Click(Sender: TObject);
var
str:widestring;
begin
n1.Method1(edit1.text,str)
end;
就还是老错误,类型不匹配。
哎呀,其死我了,帮我一把吧,我将万分感激!!

 
在Delphi的TypeEditor中是没有BSTR *可选呀
 
我有个办法:
例如声明
procedure check_user(const user_name[in], password[in]: WideString;
var ResultValue: OleVariant[in out]; const cumputername[in]: WideString);
在server端设置
begin
ResultValue:=VarArrayCreate([0,1],VarVariant);
ResultValue[0]:='my test string';
end;
client
var
Value:OleVariant;
Mystr:String;
begin
data.MainConnection.AppServer.CHeck_user('','',value,'');
if VarIsarray(Value) then
begin
Mystr:=value[0];
end;
 
可以用 Variant * 作为返回类型
 
你先不要急,慢慢来,你先要搞清楚调用方式。
对于IUnkown和IDispatch来说调用的方式是不同的。
对于你的问题二,只要你声明 str为 olevariant就行了。
procedure TForm1.Button1Click(Sender: TObject);
var
str:OleVariant;
begin
n1.Method1(edit1.text,str)
end;
 
最近老用VC,所以忘记了Delphi的TypeEditor中是没有BSTR * 可选的,
不过,可以直接输入进去,也是没有问题的。
BSTR是一个Unicode的字符串,内部结构MS并没有完全公开,不过,在Delphi中,也可以直接
把它当做是WideString(还是有一点不同的),要想在Delphi操纵Unicode字符串,
你可以使用JCL的组件集。
 
为什么我现在没法结束这次讨论而给大家分配分数了??奇怪!!
 
谢谢各位了~!!!!
 

Similar threads

后退
顶部