[疑难] D语言接口和C的关系?

hurd 2008-09-13
在 w32api里LPSTORAGE是这样定义的:
typedef _COM_interface IStorage *LPSTORAGE;


在D语言里是
定义一:
376 	interface IStorage : IUnknown
377 	{
378 	    HRESULT CreateStream( OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream * ppstm);
379 	   HRESULT OpenStream( OLECHAR *pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream * ppstm);
380 	   HRESULT CreateStorage( OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage * ppstg);
381 	   HRESULT OpenStorage( OLECHAR *pwcsName, IStorage pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage * ppstg );
382 	   HRESULT CopyTo( DWORD ciidExclude, IID *rgiidExclude, SNB snbExclude, IStorage pstgDest );
383 	    HRESULT MoveElementTo( OLECHAR * pwcsName, IStorage pstgDest, OLECHAR *pwcsNewName, DWORD grfFlags );
384 	    HRESULT Commit( DWORD grfCommitFlags );
385 	    HRESULT Revert();
386 	    HRESULT EnumElements( DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG * ppenum);
387 	    HRESULT DestroyElement( OLECHAR * pwcsName );
388 	    HRESULT RenameElement( OLECHAR *pwcsOldName, OLECHAR *pwcsNewName );
389 	    HRESULT SetElementTimes( OLECHAR * pwcsName, FILETIME * pctime, FILETIME *patime, FILETIME *pmtime );
390 	    HRESULT SetClass( REFCLSID clsid );
391 	    HRESULT SetStateBits( DWORD grfStateBits, DWORD grfMask );
392 	    HRESULT Stat( STATSTG *pstatstg, DWORD grfStatFlag );
393 	}
394 	alias IStorage LPSTORAGE;

http://www.dsource.org/projects/dwt-win/browser/dwt/internal/ole/win32/OBJIDL.d

定义二:
alias IStorage LPSTORAGE; 
//line 83

http://www.dsource.org/projects/bindings/browser/trunk/win32/objfwd.d 




在之前的版本有不同的定义:
在http://www.dsource.org/projects/bindings/browser/trunk/win32/objfwd.d?rev=99是
alias IStorage * LPSTORAGE;



不明白为什么从开始的alias IStorage * LPSTORAGE;变成alias IStorage LPSTORAGE??
Colorful 2008-09-13
_COM_interface 实际上是个宏,它是 struct 的别名。

D 中的 interface 实际上是指向 Interface 结构的指针。

所以 typedef _COM_interface IStorage *LPSTORAGE;
改成 alias IStorage LPSTORAGE;
是正确的方式。
hurd 2008-09-13
在bindings库中,LPOLECLIENTSITE是这样定义的:
alias IOleClientSite* LPOLECLIENTSITE;

win32.oleidl; LINE: 25


IOleClientSite是这样定义的
interface IOleClientSite : public IUnknown {
	HRESULT SaveObject();
	HRESULT GetMoniker(DWORD,DWORD,LPMONIKER*);
	HRESULT GetContainer(LPOLECONTAINER*);
	HRESULT ShowObject();
	HRESULT OnShowWindow(BOOL);
	HRESULT RequestNewObjectLayout();
}

win32.oleidl; LINE: 156

在w32api中是这样定义的
typedef _COM_interface IOleClientSite *LPOLECLIENTSITE;


是不是bindings里的LPOLECLIENTSITE定义有问题呢?

hurd 2008-09-13
在core32里是这样定义的:

alias IOleClientSite LPOLECLIENTSITE;
Colorful 2008-09-13
我没有研读过 bindings ,不过照你所说的话,那么它的定义是有问题的。
具体原因如我先前回复所说。
hurd 2008-09-13
我看了下,在core32里都是这样的alias I___________ LP____________;
而在bindings.win32里的oleidl.d和oaidl.d里都定义成了alias I___________* LP____________; 

但是在bindings.win32.idlfwd里缺又这样定义alias IStorage LPSTORAGE;在bindings.win32.oledlg里也没加* .
Global site tag (gtag.js) - Google Analytics