300,求Delphi7中编写一个COM,VB调用此COM的代码。(300分)

  • 主题发起人 主题发起人 wenyian0928
  • 开始时间 开始时间
W

wenyian0928

Unregistered / Unconfirmed
GUEST, unregistred user!
我只要求导出一个函数:
function TXXX.GetSystemPath():pChar;
var
Temp : array[0..255] of Char;
begin
GetSystemDirectory(Temp,255);
Result:=Temp;
end;
 
VB里也有此API函数啊!GetSystemDirectory[:D]
 
我是学习Delphi中COM编写,用VB来调用,看编写的是否正确。
 
New --->ActiveX--->ActiveX Library
New -->ActiveX--->Com Object
--->Class Name:mytest
View --->Type Library---->Imaytest--->New property(GetSystemPath)
删除其中的写属性 set_GetSystemPath
代码如下
unit Unit1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, ComObj, Ptest_TLB, StdVcl;
type
Tmytest = class(TTypedComObject, Imytest)
protected
function Get_GetSystemPath(out Value: OleVariant): HResult;
stdcall;
{Declare Imytest methods here}
end;

implementation
uses ComServ;
function Tmytest.Get_GetSystemPath(out Value: OleVariant): HResult;
var
Temp : array[0..255] of Char;
s:string;
begin
GetSystemDirectory(Temp,255);
s:=Temp;
value:=s;
end;

initialization
TTypedComObjectFactory.Create(ComServer, Tmytest, Class_mytest,
ciMultiInstance, tmApartment);
end.

工程另存为Ptest
编译后注册 此程序 regsvr32 c:/ptest.dll
新建vb程序
引用Ptest Library
加一个按钮和标签写代码如下
Private Sub Command1_Click()
Dim obj As Ptest.mytest
Set obj = New Ptest.mytest
Label1.Caption = obj.GetSystemPath

End Sub
这时Label1.Caption=C:/WINDOWS/SYSTEM32
 
同意wangminqi,就不用我牛X出马了
 
像wangminqi这样的才是好人,比那些只会说的强.
顶wangminqi.
 
土贼!
用variant
 
顶wangminqi!
 
VB中报:obj.GetSystemPath 参数不可选,是啥意思。
 
已搞定,但有几个问题请教:
1。为什么用New -->ActiveX--->Com Object,而不用,Automation Object,我看书上说用它才具有通用性,VB,VC都能使用,其它好像不行?
2。为什么要用New property,而不用New Method?
3。Delphi中如何调用呀,我怎么调用也没成功?
 
1.Automation Object应该也可以
2.New Method也可以,只是要考虑参数传递方法
3.New application
Project->add to project-> Ptest_TLB.pas(ptest 中的接口文件)
加入按钮
写入下代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Ptest_TLB, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
m:Imytest;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
v:olevariant;
begin
m:=Comytest.Create;
m.Get_GetSystemPath(v);
self.Caption :=v;
end;

end.

这时 self.Caption=C:/WINDOWS/SYSTEM32
 
你上面定义Get_GetSystemPath的属性: protected类,如果把它改为共有类:Public,
此不是用TMyTest类就能访问Get_GetSystemPath?
回答后结贴,给分。
 
在实际使用中,你不应该直接使用Tmytest类,而是通过接口调用方法或属性(其他程序根本不知道Tmytest类);
而 protected
function Get_GetSystemPath(out Value: OleVariant): HResult;
stdcall;
并不是手工加上的
而是通过View-->Type Library添加属性,编译器自动加入的
你只要在其中添加代码就可以了
 
多谢 wangminqi兄!有事还望你请教,望老兄别见外。
 
后退
顶部