[疑难] 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里也没加* . |