]> git.saurik.com Git - wxWidgets.git/blob - samples/oleauto/oleauto.cpp
Fix a crash in wxExecute() in wxMSW too.
[wxWidgets.git] / samples / oleauto / oleauto.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: oleauto.cpp
3 // Purpose: OLE Automation wxWidgets sample
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 08/12/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
22
23 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 // for all others, include the necessary headers (this file is usually all you
28 // need because it includes almost all "standard" wxWidgets headers
29 #ifndef WX_PRECOMP
30 #include "wx/wx.h"
31 #endif
32
33 #include "wx/msw/ole/automtn.h"
34
35 #ifndef __WINDOWS__
36 #error "Sorry, this sample works under Windows only."
37 #endif
38
39 // ----------------------------------------------------------------------------
40 // ressources
41 // ----------------------------------------------------------------------------
42 // the application icon
43 #ifndef wxHAS_IMAGES_IN_RESOURCES
44 #include "../sample.xpm"
45 #endif
46
47 // ----------------------------------------------------------------------------
48 // private classes
49 // ----------------------------------------------------------------------------
50
51 // Define a new application type, each program should derive a class from wxApp
52 class MyApp : public wxApp
53 {
54 public:
55 // override base class virtuals
56 // ----------------------------
57
58 // this one is called on application startup and is a good place for the app
59 // initialization (doing it here and not in the ctor allows to have an error
60 // return: if OnInit() returns false, the application terminates)
61 virtual bool OnInit();
62 };
63
64 // Define a new frame type: this is going to be our main frame
65 class MyFrame : public wxFrame
66 {
67 public:
68 // ctor(s)
69 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
70
71 // event handlers (these functions should _not_ be virtual)
72 void OnQuit(wxCommandEvent& event);
73 void OnAbout(wxCommandEvent& event);
74 void OnTest(wxCommandEvent& event);
75
76 private:
77 // any class wishing to process wxWidgets events must use this macro
78 DECLARE_EVENT_TABLE()
79 };
80
81 // ----------------------------------------------------------------------------
82 // constants
83 // ----------------------------------------------------------------------------
84
85 // IDs for the controls and the menu commands
86 enum
87 {
88 // menu items
89 OleAuto_Quit = 1,
90 OleAuto_About,
91 OleAuto_Test,
92
93 // controls start here (the numbers are, of course, arbitrary)
94 OleAuto_Text = 1000
95 };
96
97 // ----------------------------------------------------------------------------
98 // event tables and other macros for wxWidgets
99 // ----------------------------------------------------------------------------
100
101 // the event tables connect the wxWidgets events with the functions (event
102 // handlers) which process them. It can be also done at run-time, but for the
103 // simple menu events like this the static method is much simpler.
104 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
105 EVT_MENU(OleAuto_Quit, MyFrame::OnQuit)
106 EVT_MENU(OleAuto_About, MyFrame::OnAbout)
107 EVT_MENU(OleAuto_Test, MyFrame::OnTest)
108 END_EVENT_TABLE()
109
110 // Create a new application object: this macro will allow wxWidgets to create
111 // the application object during program execution (it's better than using a
112 // static object for many reasons) and also declares the accessor function
113 // wxGetApp() which will return the reference of the right type (i.e. MyApp and
114 // not wxApp)
115 IMPLEMENT_APP(MyApp)
116
117 // ============================================================================
118 // implementation
119 // ============================================================================
120
121 // ----------------------------------------------------------------------------
122 // the application class
123 // ----------------------------------------------------------------------------
124
125 // `Main program' equivalent: the program execution "starts" here
126 bool MyApp::OnInit()
127 {
128 if ( !wxApp::OnInit() )
129 return false;
130
131 // Create the main application window
132 MyFrame *frame = new MyFrame(wxT("OleAuto wxWidgets App"),
133 wxPoint(50, 50), wxSize(450, 340));
134
135 // Show it
136 frame->Show(true);
137
138 // success: wxApp::OnRun() will be called which will enter the main message
139 // loop and the application will run. If we returned false here, the
140 // application would exit immediately.
141 return true;
142 }
143
144 // ----------------------------------------------------------------------------
145 // main frame
146 // ----------------------------------------------------------------------------
147
148 // frame constructor
149 MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
150 : wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
151 {
152 // set the frame icon
153 SetIcon(wxICON(sample));
154
155 // create a menu bar
156 wxMenu *menuFile = new wxMenu;
157
158 menuFile->Append(OleAuto_Test, wxT("&Test Excel Automation..."));
159 menuFile->Append(OleAuto_About, wxT("&About"));
160 menuFile->AppendSeparator();
161 menuFile->Append(OleAuto_Quit, wxT("E&xit"));
162
163 // now append the freshly created menu to the menu bar...
164 wxMenuBar *menuBar = new wxMenuBar;
165 menuBar->Append(menuFile, wxT("&File"));
166
167 // ... and attach this menu bar to the frame
168 SetMenuBar(menuBar);
169
170 #if wxUSE_STATUSBAR
171 // create a status bar just for fun (by default with 1 pane only)
172 CreateStatusBar(2);
173 SetStatusText(wxT("Welcome to wxWidgets!"));
174 #endif // wxUSE_STATUSBAR
175 }
176
177
178 // event handlers
179
180 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
181 {
182 // true is to force the frame to close
183 Close(true);
184 }
185
186 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
187 {
188 wxMessageBox(wxT("This is an OLE Automation sample"),
189 wxT("About OleAuto"), wxOK | wxICON_INFORMATION, this);
190 }
191
192 /* Tests OLE automation by making the active Excel cell bold,
193 * and changing the text.
194 */
195 void MyFrame::OnTest(wxCommandEvent& WXUNUSED(event))
196 {
197 wxMessageBox(wxT("Excel will be started if it is not running after you have pressed OK button.")
198 wxT("\nThe active cell should then say 'wxWidgets automation test!' in bold."),
199 wxT("Excel start"));
200
201 wxAutomationObject excelObject;
202 if ( !excelObject.GetInstance(wxT("Excel.Application")) )
203 {
204 wxLogError(wxT("Could not create Excel object."));
205 return;
206 }
207
208 // Ensure that Excel is visible
209 if (!excelObject.PutProperty(wxT("Visible"), true))
210 {
211 wxLogError(wxT("Could not make Excel object visible"));
212 }
213 const wxVariant workbooksCountVariant = excelObject.GetProperty(wxT("Workbooks.Count"));
214 if (workbooksCountVariant.IsNull())
215 {
216 wxLogError(wxT("Could not get workbooks count"));
217 return;
218 }
219 const long workbooksCount = workbooksCountVariant;
220 if (workbooksCount == 0)
221 {
222 const wxVariant workbook = excelObject.CallMethod(wxT("Workbooks.Add"));
223 if (workbook.IsNull())
224 {
225 wxLogError(wxT("Could not create new Workbook"));
226 return;
227 }
228 }
229
230 if (!excelObject.PutProperty(wxT("ActiveCell.Value"), wxT("wxWidgets automation test!")))
231 {
232 wxLogError(wxT("Could not set active cell value."));
233 return;
234 }
235 if (!excelObject.PutProperty(wxT("ActiveCell.Font.Bold"), wxVariant(true)) )
236 {
237 wxLogError(wxT("Could not put Bold property to active cell."));
238 return;
239 }
240 }