error C2065: 'handle':undeclared identifier

Hi guys,

I keep getting error C2065: 'handle':undeclared identifier when trying to test this code. Can anyone see what I'm doing wrong?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <windows.h>
#include <shellapi.h>
#pragma once

namespace My54325 {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Summary for Form1
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	protected: 

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(16, 107);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(143, 58);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(284, 268);
			this->Controls->Add(this->button1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->ResumeLayout(false);

		}
#pragma endregion
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {ShellExecute(handle,"open", "C:\\Users\\Ben\\Documents\\FineReader.exe", NULL, NULL, SW_SHOWNORMAL);}

	};
}
I think you can just enter NULL instead of Handle. Handle is a name for the window HWND (H = Handle) (WND = Window).
For more information:
http://en.wikipedia.org/wiki/Hwnd
Last edited on
Should it be Handle -- with a capital H -- rather than handle? (if you mean the property of System::Windows::Forms::Form class)

... ShellExecute(this->Handle,"open", "C:\\Users\\Ben\\Documents\\FineReader.exe", NULL, NULL, SW_SHOWNORMAL); ...

(untested -- might need a cast??)
Last edited on
thx guys both of these solved that error, but it now throws another; error C2664: 'ShellExecuteW': cannot convert parameter 1 from 'System::IntPtr' to 'HWND'
If you are compiling for 32-bit Windows,

... ShellExecute((HWND)this->Handle.ToInt32(), ...

This is using the knowledge that a handle is just a 32 bit value. Some people do the same using ToPointer(), which also works with 32-bit Windows. A safe approach for code which must also compile 64-bit is not so easy.

Looking at this problem again, I noticed you're just using ShellExecute to launch an exe. So TheMassiveChipmunk's suggestion probably make more sense here.

(Launching an app is normally done -- in WIN32 -- using CreateProcess. ShellExecute is to execute a shell verb against some kind of document, e.g. "open" + "hello.txt" uses the .txt file association to work out that notepad.exe whould be used (to open hello.txt). There is an association for .exe, but if you're just launching it, it would be better to use CreateProcess.)

As you're using C++/CLI, you might be able to use System::Diagnostics::Process::Start() instead? Or did you have a problem with it?

Last edited on
Topic archived. No new replies allowed.