- 浏览: 497736 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hypercube:
markin'
配置D语言编程环境 -
qiezi:
qiezi 写道yangyang_08 写道1 ...
我的编程语言学习经历 -
qiezi:
yangyang_08 写道1、现在如果做并发服务器,楼主选用 ...
我的编程语言学习经历 -
yangyang_08:
1、现在如果做并发服务器,楼主选用什么样的语言架构?2、lua ...
我的编程语言学习经历 -
dearplain:
我也是语言爱好者,不过我一直坚持使用c。
我的编程语言学习经历
这是一个从C移植到D的代码,原文请见“Embed an HTML control in your own window using plain C”,它用C结构模拟了虚表,并且实现了多个接口以完成对Web Browser控件的调用。
在看完他的代码之后,我对于COM/OLE的了解加深了一些,以前使用VC做过COM方面的应用,也看过不少COM方面的书,不过没有涉及到界面,所以一直不知道如何把ActiveX嵌入到自己的项目中,我指的是纯手工实现,不依赖MFC/ATL。
既然是理解了,当然要把它作出来才算数,以日久又忘了。
另外要解释一下使用D语言的原因。实际上使用C++也可达到一样的效果,只是最近突然觉得使用C++很烦,而D语言又是一个很好的补充,又一直仰慕D语言作者的大名,再加上想检验D语言实际开发能力,所以这次就用它做刀了。
注:对C++觉得烦的一个重要原因,是在阅读很多优秀的C++库时,被那些宏搞得火冒三丈,难道代码非得这样写?现代的计算机语言只需要处理记号,而不是字符串,而宏却是字符串的典型,这也影响了C++程序的编译速度。或许D语言不能真正解决这个问题,但暂时还没看到令我特别不爽的东西,所以将就着用吧,反正还在Alpha阶段,也就是说语言本身也一直在改进,也一直有人在提一些改进意见,还是有些希望的。D语言作者作为优秀的Symantic C++编译器的作者,把C++的高效也带进D里面,所以我对D语言还是有很大期望的。
言规正传,先来看看要在自己在窗口里嵌入HTML control要做哪些事。简单罗列如下:
1、初始化OLE环境
2、创建一个窗口,作为ActiveX的宿主窗口
3、实现一个IStorage对象,实际上不用它来做任何事,只是OleCreate函数需要这样一个对象
4、实现IOleInPlaceSite, IOleInPlaceFrame, IOleClientSite, IDocHostUIHandler接口
5、其它就是调用了。。。
这里所列的项目没有明确的分类标准,大概同时讲了要实现的接口和代码处理过程,具体看代码吧。
由于D语言的标准库phobos没有列出我们所需要的大部分COM接口,所以需要core32,可以从http://www.dsource.org/projects/core32/下载(或SVN)。这个也不是很完整,所以在程序里我还是要定义几个变量:
下面是完整代码:
在看完他的代码之后,我对于COM/OLE的了解加深了一些,以前使用VC做过COM方面的应用,也看过不少COM方面的书,不过没有涉及到界面,所以一直不知道如何把ActiveX嵌入到自己的项目中,我指的是纯手工实现,不依赖MFC/ATL。
既然是理解了,当然要把它作出来才算数,以日久又忘了。
另外要解释一下使用D语言的原因。实际上使用C++也可达到一样的效果,只是最近突然觉得使用C++很烦,而D语言又是一个很好的补充,又一直仰慕D语言作者的大名,再加上想检验D语言实际开发能力,所以这次就用它做刀了。
注:对C++觉得烦的一个重要原因,是在阅读很多优秀的C++库时,被那些宏搞得火冒三丈,难道代码非得这样写?现代的计算机语言只需要处理记号,而不是字符串,而宏却是字符串的典型,这也影响了C++程序的编译速度。或许D语言不能真正解决这个问题,但暂时还没看到令我特别不爽的东西,所以将就着用吧,反正还在Alpha阶段,也就是说语言本身也一直在改进,也一直有人在提一些改进意见,还是有些希望的。D语言作者作为优秀的Symantic C++编译器的作者,把C++的高效也带进D里面,所以我对D语言还是有很大期望的。
言规正传,先来看看要在自己在窗口里嵌入HTML control要做哪些事。简单罗列如下:
1、初始化OLE环境
2、创建一个窗口,作为ActiveX的宿主窗口
3、实现一个IStorage对象,实际上不用它来做任何事,只是OleCreate函数需要这样一个对象
4、实现IOleInPlaceSite, IOleInPlaceFrame, IOleClientSite, IDocHostUIHandler接口
5、其它就是调用了。。。
这里所列的项目没有明确的分类标准,大概同时讲了要实现的接口和代码处理过程,具体看代码吧。
由于D语言的标准库phobos没有列出我们所需要的大部分COM接口,所以需要core32,可以从http://www.dsource.org/projects/core32/下载(或SVN)。这个也不是很完整,所以在程序里我还是要定义几个变量:
static const IID IID_IWebBrowser2 =
{0xD30C1661, 0xCDAF, 0x11d0, [0x8A, 0x3E, 0x0, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E]};
static const CLSID CLSID_WebBrowser =
{0x8856F961, 0x340A, 0x11D0, [0xA9, 0x6B, 0x0, 0xC0, 0x4F, 0xD7, 0x05, 0xA2]};
static const IID IID_IDocHostUIHandler =
{0xbd3f23c0, 0xd43e, 0x11cf, [0x89, 0x3b, 0x0, 0xaa, 0x0, 0xbd, 0xce, 0x1a]};
{0xD30C1661, 0xCDAF, 0x11d0, [0x8A, 0x3E, 0x0, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E]};
static const CLSID CLSID_WebBrowser =
{0x8856F961, 0x340A, 0x11D0, [0xA9, 0x6B, 0x0, 0xC0, 0x4F, 0xD7, 0x05, 0xA2]};
static const IID IID_IDocHostUIHandler =
{0xbd3f23c0, 0xd43e, 0x11cf, [0x89, 0x3b, 0x0, 0xaa, 0x0, 0xbd, 0xce, 0x1a]};
下面是完整代码:
private import std.stdio;
private import std.string;
private import win32.ole2;
private import win32.com.OAIDL;
private import win32.com.OLEIDL;
private import win32.com.EXDISP;
private import win32.com.MSHTMHST;
char[] ClassName = "Test Wnd Class";
static const IID IID_IWebBrowser2 =
{0xD30C1661, 0xCDAF, 0x11d0, [0x8A, 0x3E, 0x0, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E]};
static const CLSID CLSID_WebBrowser =
{0x8856F961, 0x340A, 0x11D0, [0xA9, 0x6B, 0x0, 0xC0, 0x4F, 0xD7, 0x05, 0xA2]};
static const IID IID_IDocHostUIHandler =
{0xbd3f23c0, 0xd43e, 0x11cf, [0x89, 0x3b, 0x0, 0xaa, 0x0, 0xbd, 0xce, 0x1a]};
extern (C) void gc_init();
extern (C) void gc_term();
extern (C) void _minit();
extern (C) void _moduleCtor();
extern (C) void _moduleDtor();
extern (C) void _moduleUnitTests();
extern (Windows)
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int result;
gc_init(); // initialize garbage collector
_minit(); // initialize module constructor table
try
{
_moduleCtor(); // call module constructors
_moduleUnitTests(); // run unit tests (optional)
result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
_moduleDtor(); // call module destructors
}
catch (Object o) // catch any uncaught exceptions
{
MessageBoxA(null, cast(char *)o.toString(), "Error",
MB_OK | MB_ICONEXCLAMATION);
result = 0; // failed
}
gc_term(); // run finalizers; terminate garbage collector
return result;
}
// A running count of how many windows we have open that contain a browser object
uint WindowCount = 0;
// This is used by DisplayHTMLStr(). It can be global because we never change it.
static const SAFEARRAYBOUND ArrayBound = {1, 0};
IOleObject g_browserObject = null;
class MyStorage : IStorage
{
this ()
in {writefln ("In MyStorage.this");}
out {writefln ("Out MyStorage.this");}
body{
}
~this()
in {writefln ("In MyStorage.~this");}
out {writefln ("Out MyStorage.~this");}
body{
}
HRESULT QueryInterface(IID* riid, void** pvObject)
in {writefln ("In MyStorage.QueryInterface");}
out {writefln ("Out MyStorage.QueryInterface");}
body{
return E_NOTIMPL;
}
ULONG AddRef ()
in {writefln ("In MyStorage.AddRef");}
out {writefln ("Out MyStorage.AddRef");}
body {
return 1;
}
ULONG Release ()
in {writefln ("In MyStorage.Release");}
out {writefln ("Out MyStorage.Release");}
body {
return 1;
}
HRESULT CreateStream( OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream * ppstm)
in {writefln ("In MyStorage.CreateStream");}
out {writefln ("Out MyStorage.CreateStream");}
body {
return E_NOTIMPL;
}
HRESULT OpenStream( OLECHAR *pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream * ppstm)
in {writefln ("In MyStorage.OpenStream");}
out {writefln ("Out MyStorage.OpenStream");}
body {
return E_NOTIMPL;
}
HRESULT CreateStorage( OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage * ppstg)
in {writefln ("In MyStorage.CreateStorage");}
out {writefln ("Out MyStorage.CreateStorage");}
body {
return E_NOTIMPL;
}
HRESULT OpenStorage( OLECHAR *pwcsName, IStorage pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage * ppstg )
in {writefln ("In MyStorage.OpenStorage");}
out {writefln ("Out MyStorage.OpenStorage");}
body {
return E_NOTIMPL;
}
HRESULT CopyTo( DWORD ciidExclude, IID *rgiidExclude, SNB snbExclude, IStorage pstgDest )
in {writefln ("In MyStorage.CopyTo");}
out {writefln ("Out MyStorage.CopyTo");}
body {
return E_NOTIMPL;
}
HRESULT MoveElementTo( OLECHAR * pwcsName, IStorage pstgDest, OLECHAR *pwcsNewName, DWORD grfFlags )
in {writefln ("In MyStorage.MoveElementTo");}
out {writefln ("Out MyStorage.MoveElementTo");}
body {
return E_NOTIMPL;
}
HRESULT Commit( DWORD grfCommitFlags )
in {writefln ("In MyStorage.Commit");}
out {writefln ("Out MyStorage.Commit");}
body {
return E_NOTIMPL;
}
HRESULT Revert()
in {writefln ("In MyStorage.Revert");}
out {writefln ("Out MyStorage.Revert");}
body {
return E_NOTIMPL;
}
HRESULT EnumElements( DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG * ppenum)
in {writefln ("In MyStorage.EnumElements");}
out {writefln ("Out MyStorage.EnumElements");}
body {
return E_NOTIMPL;
}
HRESULT DestroyElement( OLECHAR * pwcsName )
in {writefln ("In MyStorage.DestroyElement");}
out {writefln ("Out MyStorage.DestroyElement");}
body {
return E_NOTIMPL;
}
HRESULT RenameElement( OLECHAR *pwcsOldName, OLECHAR *pwcsNewName )
in {writefln ("In MyStorage.RenameElement");}
out {writefln ("Out MyStorage.RenameElement");}
body {
return E_NOTIMPL;
}
HRESULT SetElementTimes( OLECHAR * pwcsName, FILETIME * pctime, FILETIME *patime, FILETIME *pmtime )
in {writefln ("In MyStorage.SetElementTimes");}
out {writefln ("Out MyStorage.SetElementTimes");}
body {
return E_NOTIMPL;
}
HRESULT SetClass( REFCLSID clsid )
in {writefln ("In MyStorage.SetClass");}
out {writefln ("Out MyStorage.SetClass");}
body {
return S_OK;
}
HRESULT SetStateBits( DWORD grfStateBits, DWORD grfMask )
in {writefln ("In MyStorage.SetStateBits");}
out {writefln ("Out MyStorage.SetStateBits");}
body {
return E_NOTIMPL;
}
HRESULT Stat( STATSTG *pstatstg, DWORD grfStatFlag )
in {writefln ("In MyStorage.Stat");}
out {writefln ("Out MyStorage.Stat");}
body {
return E_NOTIMPL;
}
}
bool compare(IID* iid1, IID* iid2)
{
return !memcmp(iid1, iid2, IID.sizeof);
}
class OleInPlaceSite : IOleInPlaceSite, IOleInPlaceFrame, IOleClientSite, IDocHostUIHandler
{
private:
HWND hWnd;
public:
this (HWND hwnd)
in {writefln ("In OleInPlaceSite.this");}
out {writefln ("Out OleInPlaceSite.this");}
body {
this.hWnd = hwnd;
}
~this ()
in {writefln ("In OleInPlaceSite.~this");}
out {writefln ("Out OleInPlaceSite.~this");}
body {
}
protected:
ULONG AddRef ()
in {writefln ("In OleInPlaceSite.AddRef");}
out {writefln ("Out OleInPlaceSite.AddRef");}
body {
return 1;
}
ULONG Release ()
in {writefln ("In OleInPlaceSite.Release");}
out {writefln ("Out OleInPlaceSite.Release");}
body {
return 1;
}
HRESULT QueryInterface (IID* riid, void ** ppvObject)
in {writefln ("In OleInPlaceSite.QueryInterface");}
out {writefln ("Out OleInPlaceSite.QueryInterface");}
body {
if (compare(riid, &IID_IUnknown))
*ppvObject = cast(IUnknown)this;
else if (compare(riid, &IID_IOleClientSite))
*ppvObject = cast(IOleClientSite)this;
else if (compare(riid, &IID_IOleInPlaceSite))
{
writefln ("Ole In Place Site");
*ppvObject = cast(IOleInPlaceSite)this;
}
//else if (compare(riid, &IID_IOleInPlaceFrame))
// *ppvObject = cast(IOleInPlaceFrame)this;
else if (compare(riid, &IID_IDocHostUIHandler))
*ppvObject = cast(IDocHostUIHandler)this;
else
return E_NOINTERFACE;
return S_OK;
}
// IOleInPlaceFrame
HRESULT InsertMenus( HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths )
in {writefln ("In OleInPlaceSite.InsertMenus");}
out {writefln ("Out OleInPlaceSite.InsertMenus");}
body{
return E_NOTIMPL;
}
HRESULT SetMenu( HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject )
in {writefln ("In OleInPlaceSite.SetMenu");}
out {writefln ("Out OleInPlaceSite.SetMenu");}
body{
return S_OK;
}
HRESULT RemoveMenus( HMENU hmenuShared )
in {writefln ("In OleInPlaceSite.RemoveMenus");}
out {writefln ("Out OleInPlaceSite.RemoveMenus");}
body{
return E_NOTIMPL;
}
HRESULT SetStatusText( LPCOLESTR pszStatusText )
in {writefln ("In OleInPlaceSite.SetStatusText");}
out {writefln ("Out OleInPlaceSite.SetStatusText");}
body{
return S_OK;
}
HRESULT TranslateAccelerator( LPMSG lpmsg, WORD wID )
in {writefln ("In OleInPlaceSite.TranslateAccelerator");}
out {writefln ("Out OleInPlaceSite.TranslateAccelerator");}
body{
return E_NOTIMPL;
}
// IOleInPlaceUIWindow
HRESULT GetBorder( LPRECT lprectBorder )
in {writefln ("In OleInPlaceSite.GetBorder");}
out {writefln ("Out OleInPlaceSite.GetBorder");}
body{
return E_NOTIMPL;
}
HRESULT RequestBorderSpace( LPCBORDERWIDTHS pborderwidths )
in {writefln ("In OleInPlaceSite.RequestBorderSpace");}
out {writefln ("Out OleInPlaceSite.RequestBorderSpace");}
body{
return E_NOTIMPL;
}
HRESULT SetBorderSpace( LPCBORDERWIDTHS pborderwidths )
in {writefln ("In OleInPlaceSite.SetBorderSpace");}
out {writefln ("Out OleInPlaceSite.SetBorderSpace");}
body{
return E_NOTIMPL;
}
HRESULT SetActiveObject( IOleInPlaceActiveObject pActiveObject, LPCOLESTR pszObjName )
in
private import std.string;
private import win32.ole2;
private import win32.com.OAIDL;
private import win32.com.OLEIDL;
private import win32.com.EXDISP;
private import win32.com.MSHTMHST;
char[] ClassName = "Test Wnd Class";
static const IID IID_IWebBrowser2 =
{0xD30C1661, 0xCDAF, 0x11d0, [0x8A, 0x3E, 0x0, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E]};
static const CLSID CLSID_WebBrowser =
{0x8856F961, 0x340A, 0x11D0, [0xA9, 0x6B, 0x0, 0xC0, 0x4F, 0xD7, 0x05, 0xA2]};
static const IID IID_IDocHostUIHandler =
{0xbd3f23c0, 0xd43e, 0x11cf, [0x89, 0x3b, 0x0, 0xaa, 0x0, 0xbd, 0xce, 0x1a]};
extern (C) void gc_init();
extern (C) void gc_term();
extern (C) void _minit();
extern (C) void _moduleCtor();
extern (C) void _moduleDtor();
extern (C) void _moduleUnitTests();
extern (Windows)
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int result;
gc_init(); // initialize garbage collector
_minit(); // initialize module constructor table
try
{
_moduleCtor(); // call module constructors
_moduleUnitTests(); // run unit tests (optional)
result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
_moduleDtor(); // call module destructors
}
catch (Object o) // catch any uncaught exceptions
{
MessageBoxA(null, cast(char *)o.toString(), "Error",
MB_OK | MB_ICONEXCLAMATION);
result = 0; // failed
}
gc_term(); // run finalizers; terminate garbage collector
return result;
}
// A running count of how many windows we have open that contain a browser object
uint WindowCount = 0;
// This is used by DisplayHTMLStr(). It can be global because we never change it.
static const SAFEARRAYBOUND ArrayBound = {1, 0};
IOleObject g_browserObject = null;
class MyStorage : IStorage
{
this ()
in {writefln ("In MyStorage.this");}
out {writefln ("Out MyStorage.this");}
body{
}
~this()
in {writefln ("In MyStorage.~this");}
out {writefln ("Out MyStorage.~this");}
body{
}
HRESULT QueryInterface(IID* riid, void** pvObject)
in {writefln ("In MyStorage.QueryInterface");}
out {writefln ("Out MyStorage.QueryInterface");}
body{
return E_NOTIMPL;
}
ULONG AddRef ()
in {writefln ("In MyStorage.AddRef");}
out {writefln ("Out MyStorage.AddRef");}
body {
return 1;
}
ULONG Release ()
in {writefln ("In MyStorage.Release");}
out {writefln ("Out MyStorage.Release");}
body {
return 1;
}
HRESULT CreateStream( OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream * ppstm)
in {writefln ("In MyStorage.CreateStream");}
out {writefln ("Out MyStorage.CreateStream");}
body {
return E_NOTIMPL;
}
HRESULT OpenStream( OLECHAR *pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream * ppstm)
in {writefln ("In MyStorage.OpenStream");}
out {writefln ("Out MyStorage.OpenStream");}
body {
return E_NOTIMPL;
}
HRESULT CreateStorage( OLECHAR *pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStorage * ppstg)
in {writefln ("In MyStorage.CreateStorage");}
out {writefln ("Out MyStorage.CreateStorage");}
body {
return E_NOTIMPL;
}
HRESULT OpenStorage( OLECHAR *pwcsName, IStorage pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage * ppstg )
in {writefln ("In MyStorage.OpenStorage");}
out {writefln ("Out MyStorage.OpenStorage");}
body {
return E_NOTIMPL;
}
HRESULT CopyTo( DWORD ciidExclude, IID *rgiidExclude, SNB snbExclude, IStorage pstgDest )
in {writefln ("In MyStorage.CopyTo");}
out {writefln ("Out MyStorage.CopyTo");}
body {
return E_NOTIMPL;
}
HRESULT MoveElementTo( OLECHAR * pwcsName, IStorage pstgDest, OLECHAR *pwcsNewName, DWORD grfFlags )
in {writefln ("In MyStorage.MoveElementTo");}
out {writefln ("Out MyStorage.MoveElementTo");}
body {
return E_NOTIMPL;
}
HRESULT Commit( DWORD grfCommitFlags )
in {writefln ("In MyStorage.Commit");}
out {writefln ("Out MyStorage.Commit");}
body {
return E_NOTIMPL;
}
HRESULT Revert()
in {writefln ("In MyStorage.Revert");}
out {writefln ("Out MyStorage.Revert");}
body {
return E_NOTIMPL;
}
HRESULT EnumElements( DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG * ppenum)
in {writefln ("In MyStorage.EnumElements");}
out {writefln ("Out MyStorage.EnumElements");}
body {
return E_NOTIMPL;
}
HRESULT DestroyElement( OLECHAR * pwcsName )
in {writefln ("In MyStorage.DestroyElement");}
out {writefln ("Out MyStorage.DestroyElement");}
body {
return E_NOTIMPL;
}
HRESULT RenameElement( OLECHAR *pwcsOldName, OLECHAR *pwcsNewName )
in {writefln ("In MyStorage.RenameElement");}
out {writefln ("Out MyStorage.RenameElement");}
body {
return E_NOTIMPL;
}
HRESULT SetElementTimes( OLECHAR * pwcsName, FILETIME * pctime, FILETIME *patime, FILETIME *pmtime )
in {writefln ("In MyStorage.SetElementTimes");}
out {writefln ("Out MyStorage.SetElementTimes");}
body {
return E_NOTIMPL;
}
HRESULT SetClass( REFCLSID clsid )
in {writefln ("In MyStorage.SetClass");}
out {writefln ("Out MyStorage.SetClass");}
body {
return S_OK;
}
HRESULT SetStateBits( DWORD grfStateBits, DWORD grfMask )
in {writefln ("In MyStorage.SetStateBits");}
out {writefln ("Out MyStorage.SetStateBits");}
body {
return E_NOTIMPL;
}
HRESULT Stat( STATSTG *pstatstg, DWORD grfStatFlag )
in {writefln ("In MyStorage.Stat");}
out {writefln ("Out MyStorage.Stat");}
body {
return E_NOTIMPL;
}
}
bool compare(IID* iid1, IID* iid2)
{
return !memcmp(iid1, iid2, IID.sizeof);
}
class OleInPlaceSite : IOleInPlaceSite, IOleInPlaceFrame, IOleClientSite, IDocHostUIHandler
{
private:
HWND hWnd;
public:
this (HWND hwnd)
in {writefln ("In OleInPlaceSite.this");}
out {writefln ("Out OleInPlaceSite.this");}
body {
this.hWnd = hwnd;
}
~this ()
in {writefln ("In OleInPlaceSite.~this");}
out {writefln ("Out OleInPlaceSite.~this");}
body {
}
protected:
ULONG AddRef ()
in {writefln ("In OleInPlaceSite.AddRef");}
out {writefln ("Out OleInPlaceSite.AddRef");}
body {
return 1;
}
ULONG Release ()
in {writefln ("In OleInPlaceSite.Release");}
out {writefln ("Out OleInPlaceSite.Release");}
body {
return 1;
}
HRESULT QueryInterface (IID* riid, void ** ppvObject)
in {writefln ("In OleInPlaceSite.QueryInterface");}
out {writefln ("Out OleInPlaceSite.QueryInterface");}
body {
if (compare(riid, &IID_IUnknown))
*ppvObject = cast(IUnknown)this;
else if (compare(riid, &IID_IOleClientSite))
*ppvObject = cast(IOleClientSite)this;
else if (compare(riid, &IID_IOleInPlaceSite))
{
writefln ("Ole In Place Site");
*ppvObject = cast(IOleInPlaceSite)this;
}
//else if (compare(riid, &IID_IOleInPlaceFrame))
// *ppvObject = cast(IOleInPlaceFrame)this;
else if (compare(riid, &IID_IDocHostUIHandler))
*ppvObject = cast(IDocHostUIHandler)this;
else
return E_NOINTERFACE;
return S_OK;
}
// IOleInPlaceFrame
HRESULT InsertMenus( HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths )
in {writefln ("In OleInPlaceSite.InsertMenus");}
out {writefln ("Out OleInPlaceSite.InsertMenus");}
body{
return E_NOTIMPL;
}
HRESULT SetMenu( HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject )
in {writefln ("In OleInPlaceSite.SetMenu");}
out {writefln ("Out OleInPlaceSite.SetMenu");}
body{
return S_OK;
}
HRESULT RemoveMenus( HMENU hmenuShared )
in {writefln ("In OleInPlaceSite.RemoveMenus");}
out {writefln ("Out OleInPlaceSite.RemoveMenus");}
body{
return E_NOTIMPL;
}
HRESULT SetStatusText( LPCOLESTR pszStatusText )
in {writefln ("In OleInPlaceSite.SetStatusText");}
out {writefln ("Out OleInPlaceSite.SetStatusText");}
body{
return S_OK;
}
HRESULT TranslateAccelerator( LPMSG lpmsg, WORD wID )
in {writefln ("In OleInPlaceSite.TranslateAccelerator");}
out {writefln ("Out OleInPlaceSite.TranslateAccelerator");}
body{
return E_NOTIMPL;
}
// IOleInPlaceUIWindow
HRESULT GetBorder( LPRECT lprectBorder )
in {writefln ("In OleInPlaceSite.GetBorder");}
out {writefln ("Out OleInPlaceSite.GetBorder");}
body{
return E_NOTIMPL;
}
HRESULT RequestBorderSpace( LPCBORDERWIDTHS pborderwidths )
in {writefln ("In OleInPlaceSite.RequestBorderSpace");}
out {writefln ("Out OleInPlaceSite.RequestBorderSpace");}
body{
return E_NOTIMPL;
}
HRESULT SetBorderSpace( LPCBORDERWIDTHS pborderwidths )
in {writefln ("In OleInPlaceSite.SetBorderSpace");}
out {writefln ("Out OleInPlaceSite.SetBorderSpace");}
body{
return E_NOTIMPL;
}
HRESULT SetActiveObject( IOleInPlaceActiveObject pActiveObject, LPCOLESTR pszObjName )
in
发表评论
-
D语言模板和编译期执行
2012-07-29 00:15 0D语言模板继承了C++模板的基本用法,在其上做了相当多扩充,近 ... -
Generator
2008-04-09 13:46 2008几种并发编程模型开销(从大到小): Process > ... -
lambda之路...
2007-11-09 22:57 2866DMD最近的版本号加入了闭包,感觉非常有用,虽然有些背后动作, ... -
像Erlang一样写D程序
2007-09-15 10:23 6732琢磨了好久,一直没时间来做它。在讨论这个问题的时候就已经有这想 ... -
[D语言] qsort的尴尬
2007-05-06 21:31 5076phobos里面在stc.c.stdlib里提供了qsort, ... -
强类型数值计算
2007-04-10 21:45 4720以前曾经讨论过使用typedef来完成强类型的数值计算,最终遇 ... -
简单的单元测试框架
2007-04-10 21:20 3147做了个简单的单元测试框架,只算个毛坯,遇到一些问题。 1、由 ... -
仿STL的vector,写了一组array操作方法。
2007-04-05 23:55 12031文档从MSDN抄过来的,稍稍改了一下。 module ar ... -
编译期执行的效率
2007-03-15 15:58 4222写了一个编译期执行的fibonacci模板: templ ... -
D语言编译期生成和编译期执行技术
2007-02-24 14:35 4121借助D语言新的mixin表达式,可以完成一些代码生成功能,比如 ... -
如何获得一个方法的名字?
2007-01-15 19:24 3491在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不 ... -
D语言的函数编程
2007-01-07 11:17 3856前阵子论坛上有人问我D语言做函数编程怎样,老实说我没怎么想过这 ... -
D语言和python的差异
2007-01-07 10:12 6554这2个语言的比较怪怪的,我最近转换了一些twisted的源文件 ... -
从简单测试看D数组内存分配策略
2007-01-07 09:43 3227D语言动态数组可以在运行期改变大小,这和C++的vector相 ... -
DMD 0.178发布
2006-12-24 15:32 4602What's New for D 0.178 ... -
GDC 0.20发布
2006-12-17 14:35 2798引用 * Updated to DMD 0.177 * Fix ... -
DMD 0.177发布
2006-12-09 18:47 2275没什么亮点,BUG修复得也不多,BUG数量始终保持在250-2 ... -
DMD 0.176发布
2006-12-03 14:22 3072引用 What's New for D 0.176 Dec ... -
D语言的成员函数模板
2006-12-02 20:29 3074DMD 0.166 特性列表中有一条: * ncorp ... -
D语言 在栈上分配对象 以及 无需GC拖管对象
2006-11-28 13:18 2810一、栈上分配对象 C++可以轻易实现在栈上和堆上分配对象,例 ...
相关推荐
在本案例中,“调用ActiveX在对话框中显示网页”是一个简洁且实用的方法,相比使用HTMLView控件,可能具有更高的灵活性和更少的复杂性。 首先,我们需要了解如何在VC++(Visual C++)环境中创建和使用对话框。...
在本文示例的`MyWindow.java`代码中,我们可以看到对JNI的运用,这正是实现Java调用ActiveX控件的关键。 #### 示例代码解析 - **导入必要的包**:首先,`MyWindow`类导入了`java.awt.*`、`javax.swing.*`等包,...
HTML和JavaScript调用ActiveX控件是Windows平台上一种常见的技术,尤其在早期的Web应用程序中,用于实现浏览器端与本地操作系统更深入的交互。ActiveX控件是由Microsoft开发的一种技术,允许开发者创建可嵌入到网页...
在LabWindows/CVI中,通过调用ActiveX控件,开发者可以利用已存在的ActiveX技术来增强其应用程序的功能,比如播放多媒体文件、访问数据库等。本教程将详细介绍如何在LabWindows/CVI中调用ActiveX控件,以实现多媒体...
在本文中,我们将深入探讨如何在Visual Studio 2015 (VS2015) 中使用MFC ActiveX技术,特别是在一个对话框中嵌入并调用另一个ActiveX控件。MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于简化...
在本案例中,"RCP开发,调用ActiveX控件"指的是在RCP应用程序中嵌入和使用ActiveX技术。ActiveX是Microsoft提出的一种组件对象模型,主要用于Windows环境,它能够使开发人员创建和使用小型、可重用的代码片段(控件...
标题中的“调用activex控件读硬盘.rar”指的是在网页环境中使用ActiveX控件来访问用户的硬盘内容。ActiveX是Microsoft开发的一种技术,主要用于Internet Explorer浏览器,它允许网页嵌入可执行组件,如控件,以扩展...
- 理解如何在网页中调用ActiveX控件的方法,以及处理控件返回的数据。 这个示例对于想要将本地应用程序的功能扩展到网页环境,或者需要在网页中利用Delphi的强大功能的开发者来说,是非常有价值的教育资源。
在LabWindows/CVI中,通过调用ActiveX控件,可以利用已有的ActiveX技术来扩展其功能,比如访问多媒体库、数据库、网页浏览器等。本教程将详细介绍如何在LabWindows/CVI中调用ActiveX控件,以实现多媒体库的操作。 ...
在WinForm中,通过ActiveX控件,可以将Unity3D的场景嵌入到Windows Forms窗口中。 3. **C#编程**:C#是.NET框架的主要编程语言,适用于开发Windows桌面应用。在本案例中,C#用于编写WinForm应用,同时与Unity3D的...
在本主题中,我们将深入探讨如何将Cocos2D窗口嵌入到MFC ActiveX控件中,以实现更灵活的跨平台应用或增强的用户界面。 首先,我们需要理解Cocos2D和MFC ActiveX的基础知识。Cocos2D提供了一个基于图层、精灵、动作...
在IT行业中,跨语言通信是常见的需求,尤其是在老版本的软件开发中。本主题将深入探讨如何在Visual Studio 2008(VS2008)环境下,使用C++代码调用由VB6.0编写的ActiveX DLL。ActiveX DLL是一种组件,它允许不同编程...
标题 "Web中使用Fastreport在ActiveX调用打印例子" 提到的是一个使用Fastreport在Web环境下通过ActiveX技术进行打印操作的示例。Fastreport是一款强大的报表设计和生成工具,广泛应用于各种软件开发环境中,包括...
例如,可以使用`创建进程`命令创建一个新的进程,然后在进程中调用`LoadLibrary`或`CoCreateInstance`等函数来加载并激活ActiveX控件。 接下来,我们讨论ActiveX的注册。注册ActiveX控件是将其信息写入到系统注册表...
在Windows应用程序开发中,ActiveX控件是一种强大的工具,它允许开发者在应用程序中嵌入各种功能组件。本文将深入探讨如何在视图窗口中动态创建ActiveX控件FlexGrid,这是一种常用的多行多列数据显示控件,常用于...
例如,数据库访问、VRML浏览等原本在Director中难以实现的功能,可以通过嵌入ActiveX控件来解决。这不仅提高了Director的功能性,还增强了其灵活性和实用性。 #### 三、ActiveX控件的基本控制构成 每个ActiveX控件...
这些控件可以嵌入到网页中,通过JavaScript或者其他客户端脚本语言进行调用。在本例中,开发了一个简单的ActiveX控件,该控件调用了之前编写的DLL,实现了加法功能。 在Web应用中,JavaScript通常用于处理用户交互...
但是,有一些第三方解决方案可以实现Firefox调用ActiveX控件,例如"ffactivex"项目。 "ffactivex"是一个专为Firefox设计的插件,它使Firefox能够模拟Internet Explorer的行为,以便在需要ActiveX支持的场合下工作。...
ActiveX是一种由微软在1996年推出的组件技术,主要应用于Windows平台,它允许开发者创建可以在网页或者应用程序中嵌入的小型可执行组件。在本案例中,我们讨论的是一个使用Delphi编写的ActiveX控件。Delphi是...
如果你的ActiveX控件涉及多媒体或Web相关内容,这个SWF文件可能用于演示如何在Java程序中嵌入和控制Flash内容。 `src`目录通常包含Java源代码文件。在这个项目中,你应该在这里找到`ActiveXExample.java`或其他与...