我再也不想用createoleobject方式开发了,吕雪松请进。。 (50分)

  • 主题发起人 主题发起人 刘永学
  • 开始时间 开始时间

刘永学

Unregistered / Unconfirmed
GUEST, unregistred user!
各位同仁:
众所周知,在delphi中通过ole自动化方式、派遣接口方式、以及接口方式来调用mapinfo
的机制与效率都是不同的。(通过派遣接口与接口方式调用比较相似),利用接口或
派遣接口调用mapinfo的速度是通过ole自动化方式的好几倍,并且是先期联编(这点,
已经有好几位delphi 好手在书中论述过了,如 李维等)。我在mapinfo目录下,发现了
一个文件mapinfo.tlb,于是我将之引入到delphi中(通过project /import type library )
生成了Mapinfo_TLB.pas文件。仔细浏览该文件,发现它实现了双接口,可以通过操纵接口
达到控制mapinfo的目的。如下:
uses Mapinfo_TLB.pas;
var map:DMapInfo;
mapp:DMIMapGen;
。。。
map:=CoMapInfoApplication.Create
map.Do_ ('Set Application Window '+ inttostr(panel1.Handle));
map.Do_ ('Set Nextdo
cument Parent '+inttostr(panel1.Handle)+' Style 1');
map.Do_ ('OPEN TABLE。。。 AS。。。 ');
map.Do_ ('MAP FROM ');//do_是map提供的方法
。。。
在这里,就可以使用DMapInfo派遣接口,可是如何使用DMIMapGen等派遣接口呢? 在delphi中如何使用IMapInfo等接口呢?
我试着用以下语句:
mapp:=map.MIMapGen as DMIMapGen;
mapp.zoommap(10);
发现可以操纵DMIMapGen派遣接口,但一点反映也没有;问题是不知在何时、何地使用这个派遣接口?
在文件中,得知
class function CoMapInfoApplication.Create: DMapInfo;
begin

Result := CreateComObject(CLASS_MapInfoApplication) as DMapInfo;
end;

也就是CoMapInfoApplication构造时,返回的函数类型就是DMapInfo,但我又想使用
IMapInfo接口,我该怎么办呢?
这些问题已经困扰我好多天了,请各位大侠拔刀相助。。。。
 
我不懂DELPHI,在VC中有AttachDispach和ReleaseDispatch方法,你看看在DELPHI
中有类似的函数吗?
 
我不知道。不过应该可以再用一次as。就象那个精典的生成快捷方式文件的程序一样。
 
算了,大家登记一下吧,进来回话的都有分!!!
 
看看CreateOleObject和CreateComObject的区别吧,你既然会用前者,后者应该也不难吧!
(我只是帮你提示一下,我也不是太懂)
function CreateComObject(const ClassID: TGUID): IUnknown;
begin

OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, Result));
end;


function CreateOleObject(const ClassName: string): IDispatch;
var
ClassID: TCLSID;
begin

ClassID := ProgIDToClassID(ClassName);
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result));
end;

 
记得以前用Delphi操纵Mapinfo时,用的就是CreateOleObject和DDE,用过一个
Com Object只是用来进行回调。
如何使用CreateComObject,尚需学习
 
I guess the DMIMapGen is a EventSink, you might try the way below todo


create a TEventSink class
TEventSink = class(TInterfacedObject, IUnknown,IDispatch)
private
{IUknown methods}
function QueryInterface(const IID: TGUID;
out Obj):HResult;stdcall;
{Idispatch}
function GetTypeInfoCount(out Count: Integer): HResult;
stdcall;
function GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
stdcall;
function GetIDsOfNames(const IID: TGUID;
Names: Pointer;
NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult;
stdcall;
function Invoke(DispID: Integer;
const IID: TGUID;
LocaleID: Integer;
Flags: Word;
var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
public
constructor Create
end;



function TEventSink.QueryInterface(const IID: TGUID;
out Obj):HResult;stdcall;
begin

if GetInterFace(IID,Obj) then

Result := S_OK
else
if IsEqualIID(IID, DMIMapGen) then

Result := QueryInterface(IDispatch,Obj)
else

Result := E_NOINTERFACE;
end;

constructor TEventSink.Create
begin

inherited Create;
end;


function TEventSink.GetTypeInfoCount(out Count: Integer): HResult;
begin

Result := S_OK;
end;

function TEventSink.GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
begin

Result := S_OK;
end;

function TEventSink.GetIDsOfNames(const IID: TGUID;
Names: Pointer;
NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult;
begin

Result := S_OK;
end;


function TEventSink.Invoke(DispID: integer;
const IID: TGUID;
LocaleID: integer;
Flags: Word;
var Params;
VarResult,ExcepInfo,ArgErr:Pointer): HResult;
begin

Result := S_OK;
case DispID of
do
something here .......
..
end;

end;


add these code to create and destroy part
//create
if FEventSink=nil then
FEventSink := TEventSink.Create;
InterfaceConnect(map, DMIMapGen ,FEventSink,FConnectionToken);
//destroy
InterfaceDisconnect(map, DMIMapGen ,FConnectionToken);


 
开帖的讲了半天,就想说IDIPSPATCH不好,太慢。
我比较熟悉IDIPSPATCH,它速度慢是不快,但是它的灵活性足可以让你自己设计一个脚本
语言。
 
你现在用什么方式开发GIS系统?
 
使用 import library 的方式就不需要使用 createoleobjet,可以直接在form上添加对象。。
也可以直接定义的。。。
project
|_import type library
这个方法其实就是比impport acitvex control 多了一写wrapper
与vb里面的refrence类似

 
用MapX吧,多么方便啊!
 
To netbirdfly,
你说的什么意思,是用MAPX吧,Import type library 然后就怎么样了?能否详细些?
 
后退
顶部