急需!求VC写的COM组件,在DELPHI7中使用的实例源码!在线等! ( 积分: 300 )

Y

yuey

Unregistered / Unconfirmed
GUEST, unregistred user!
如题
要求如下:
1.vc6.0编写出来的COM组件,包括源码.(因为朋友用2003写了个,但根本在我电脑中注册不了,只有vc6.0写的可以注册,不知道什么原因).
2.COM功能,写一个简单的类,然后里面包括一些数据类型的转换和几个输入输出函数;
3.COM能在DELPHI7中使用,包括源码.(导入类型库)
4.另外在delphi7源码中写上几种类型的转换,如
widestringtochar
array of char to widestring
OleVariant to byte
OleVariant to char array of char
OleVariant to widestring
widestring to OleVariant
byte to OleVariant
char to OleVariant
等相关转换 越多类型转换越好.
急需,如果分数不够,可以另外开贴再给分.在线等.
 
帮帮小弟吧,大虾们.
 
不明白楼主想要什么。
如果只是在delphi中调用com组件
ITest := CreateComObject(constClassID) as Itest2;
//创建com实例
itest.XXXX //调用com里面的方法或函数
不过你需要先import这个dll,然后uses 产生的tlb文件。否则会找不到接口的定义。
也可以看看这篇文章:http://www.delphibbs.com/delphibbs/dispq.asp?lid=2941585
 
我明白怎么调用的,但是有些VC中的数据类型我搞不明白.
最好能提供份相关的实例源码.
 
在delphi的projects菜单下有个 import type lib菜单,导入那个com的dll文件,然后点击 create unit按钮,delphi会自动生成一个接口单元,里面要用的数据类型全部已经是delphi的声明了。
 
嗯.这个我清楚.可能你没有明白我想问的问题.
我把情况给你说下.
因为同事用的是VC,我用D写客户端.现在想让同事做个COM组件,里面包括一些与客户端通信的函数还有解包,加密包的一些东东,现在他做成了类给我,但里面好多他用的字符串指针什么的我在delphi中create unit以后,好多参数都变了.比如他原先定义的BYTE*到了D里面就成别的了.
我想要个实例源码,主要也是因为他以前也没有写过COM给Delphi调用,所以有些数据类型不知道应该用什么,还有就是我基础不怎么样,有些数据类型转换不过来.所以想要两个实例源码看下.
 
你不用管他vc里面用的是什么。就当com是一个黑箱。你就按create出来的unit里面的定义调用就是了。
 
我试过,其它他有一个被我create出来的一个函数
function Test1(vt1: OleVariant): OleVariant;
safecall;
可是我在输入一个字符串以后.
比如我现在使用这个函数了.
var
TT:array[0..100] of Char;
TT2,TT3:eek:leVariant;
begin
TT := 'asdf';
这里怎么进行转换了?TT和TT2
tt3 := Test1(TT2);
然后这里怎么showmessage TT3了.
end;
还有就是byte到oleVariant;怎么转换了?
 
//将array of char转换为 olevariant
function TForm1.ArrToVariant(var Arr: array of char):Olevariant;
var
I: Integer;
MyBuffer: Pointer;
P: ^Char;
begin
Result := VarArrayCreate([0, High(Arr)], VarByte);
MyBuffer:=VarArrayLock(Result);
for I := 0 to High(Arr)do
begin
P := Pointer(Integer(MyBuffer) + I);
P^ := Arr;

end;
VarArrayUnlock(Result);
end;

// Arr必须是已经分配的数组,而且长度要等于avariant的长度;
procedure TForm1.VariantToArr(AVariant: Olevariant;
var Arr: array of char);
var
I: Integer;
MyBuffer: Pointer;
P: ^Char;
begin
MyBuffer := VarArrayLock(AVariant);
for I := 0 to High(Arr)do
begin
P := Pointer(Integer(MyBuffer) + I);
Arr := p^;
end;
VarArrayUnlock(AVariant);
end;
end.
这是转换的函数,但我到最后输出的结果总是和他在VC中输出的结果不一样。
我也搞不清楚到底是他那里有问题还是我这边哪里有问题。
 
让你朋友在vc内使用 pchar 或者 widestring类型吧。
 
ufo!你有没有这方面相关的实例源码,能不能给我份?
 
我用的都是 widestring 类型。 com和调用者都是自己写的。
 
嗯.那就只把你的实例源码发给我份吧,谢谢
705428@qq.com
 
我是用ole方式创建的,调用代码如下:
var
jpg: oleVariant;
begin

jpg:= CreateOleObject('html2jpgdll.html2jpg');
jpg.createjpg_pagination('e:/index.htm','e:/index.jpg')

end;

在ole组件内的声明是:
procedure createjpg_pagination(const HtmName, JpgName: WideString);
safecall;
 
procedure Test3(const bstr1: WideString;
out bstr2: WideString);
safecall;
我使用的时候
var
W,WW:WideString;
W := '盛果科技';
obj.Test3(w,ww);
ShowMessage(ww);
然后就出错 write of address 00000000
是不是ww得先分配下内存了,还是其它什么?
 
ufo!这里我直接给分了,我的QQ:705428
你加我QQ好不,可能中间还会出现很多偶不懂的.到时候向您咨询一下.
 
你要先创建实例,用CreateOleObject,看上面我给的例子。
要 uses comobj单元
 
嗯这些我都做过了.我现在就是在调用使用以后出问题的.前面的我都知道的.导入类型库,创建实例什么的都做过了.obj.Test3(w,ww);
obj := createComobject(CLASS_Packet) as IPacket;
procedure Test3(const bstr1: WideString;
out bstr2: WideString);
safecall;
我使用的时候
var
W,WW:WideString;
W := '盛果科技';
obj.Test3(w,ww);
ShowMessage(ww);
然后就出错 write of address 00000000
是不是ww得先分配下内存了,还是其它什么?
 
out类型是传地址进去的,你只是声明了一个变量,没有初始化,其地址是无效的。
我们平时使用string类型时,由于是处于同一个内存管理器内,delphi已经替我们分配了内存了。因此这里应该你自己预先分配好内存。
简单一点的,先ww:= 'abcdefg';
不过要注意防止内存越界。
 
如何用Delphi调用由VC开发的ATL/COM服务,并响应其事件:
http://www.jxstnu.cn/xieyunc/read.php?114
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部