By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,483 Members | 3,261 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,483 IT Pros & Developers. It's quick & easy.

CALLBACK procedure (invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe)

P: n/a
Hi,

I try to figure out how to use Callback procedure in a C++ form
project

The following code *work* perfectly on a console project

#include "Windows.h"
BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lparam)
{
// blablabla we dont care for now
return (TRUE);
}
int main()
{
EnumWindows((WNDENUMPROC) MyEnumWindowsProc,0);
}

But in the C++ form project it return the following error :

Error C3641: 'MyEnumWindowsProc' : invalid calling convention
'__stdcall ' for function compiled with /clr:pure or /clr:safe

I already read a lot of post on the subject but still trying to find
an answer...

Thanks!

Mike

Sep 16 '07 #1
Share this Question
Share on Google+
10 Replies


P: n/a
Hi SQACPP!
Error C3641: 'MyEnumWindowsProc' : invalid calling convention
'__stdcall ' for function compiled with /clr:pure or /clr:safe
Switch the setting in your project to:
"Common language runtime support" to "/clr"
--
Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/
Sep 16 '07 #2

P: n/a
On Sep 16, 2:06 am, "Jochen Kalmbach [MVP]" <nospam-
Jochen.Kalmb...@holzma.dewrote:
Hi SQACPP!
Error C3641: 'MyEnumWindowsProc' : invalid calling convention
'__stdcall ' for function compiled with /clr:pure or /clr:safe

Switch the setting in your project to:
"Common language runtime support" to "/clr"

--
Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/
Thanks! it work with /clr

I'm wondering one another thing about CALLBACK functions....

By example if i want to print something in a textBox from my callback
function how can i access to my textBox ? This->textBox1.Text or
Form1->textBox1.Text are not available in the callback

In other word i'm trying the print the handle or the caption of each
window in a TextBox control and i dont know how to access to my
TextBox from the callback (EnumWindowsProc).

In a console application I can just output (cout) each window handle
to the console but I cant figure out how to do this in a C++ form
project. Is anybody know how to access to my TextBox1 from the
callback?

Thanks again!

Sep 16 '07 #3

P: n/a
SQACPP wrote:
I'm wondering one another thing about CALLBACK functions....

By example if i want to print something in a textBox from my callback
function how can i access to my textBox ? This->textBox1.Text or
Form1->textBox1.Text are not available in the callback

In other word i'm trying the print the handle or the caption of each
window in a TextBox control and i dont know how to access to my
TextBox from the callback (EnumWindowsProc).

In a console application I can just output (cout) each window handle
to the console but I cant figure out how to do this in a C++ form
project. Is anybody know how to access to my TextBox1 from the
callback?
SQACPP:

I'm not so sure about managed/unmanaged issues, but in Win32 you would
pass a pointer to a user-defined struct as the LPARAM parameter of
EnumWindows(). This struct can contain anything you like (strings,
window handles, whatever).

--
David Wilkinson
Visual C++ MVP
Sep 16 '07 #4

P: n/a
On 16 sep, 07:27, David Wilkinson <no-re...@effisols.comwrote:
SQACPP wrote:
I'm wondering one another thing about CALLBACK functions....
By example if i want to print something in a textBox from my callback
function how can i access to my textBox ? This->textBox1.Text or
Form1->textBox1.Text are not available in the callback
In other word i'm trying the print the handle or the caption of each
window in a TextBox control and i dont know how to access to my
TextBox from the callback (EnumWindowsProc).
In a console application I can just output (cout) each window handle
to the console but I cant figure out how to do this in a C++ form
project. Is anybody know how to access to my TextBox1 from the
callback?

SQACPP:

I'm not so sure about managed/unmanaged issues, but in Win32 you would
pass a pointer to a user-defined struct as the LPARAM parameter of
EnumWindows(). This struct can contain anything you like (strings,
window handles, whatever).

--
David Wilkinson
Visual C++ MVP
Sounds like a good ideas but i dont know how to declare the type of
"this" (Form1) to pass it to my callback function :

struct FormReference {
int FormRef; // ** What is the "this" (form1) type?
int blabla;
};

BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lparam)
{
// I want to access to this->textBox1->Text in this callback
function
lparam.FormRef->textBox1->Text+="x\n"; // ?????
return (TRUE);
}
//...
....main()
{
FormReference *MyFormReference;
// *** How to define define MyFormReference.FormRef=this; ?????????
EnumWindows((WNDENUMPROC)MyEnumWindowsProc,0); // ** How to pass
the pointer to the structure as LPARAM for the last parameter?
}
Sep 17 '07 #5

P: n/a

"SQACPP" <ls*********@hotmail.comwrote in message
news:11**********************@w3g2000hsg.googlegro ups.com...
On Sep 16, 2:06 am, "Jochen Kalmbach [MVP]" <nospam-
Jochen.Kalmb...@holzma.dewrote:
>Hi SQACPP!
Error C3641: 'MyEnumWindowsProc' : invalid calling convention
'__stdcall ' for function compiled with /clr:pure or /clr:safe

Switch the setting in your project to:
"Common language runtime support" to "/clr"

--
Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/

Thanks! it work with /clr

I'm wondering one another thing about CALLBACK functions....

By example if i want to print something in a textBox from my callback
function how can i access to my textBox ? This->textBox1.Text or
Form1->textBox1.Text are not available in the callback

In other word i'm trying the print the handle or the caption of each
window in a TextBox control and i dont know how to access to my
TextBox from the callback (EnumWindowsProc).

In a console application I can just output (cout) each window handle
to the console but I cant figure out how to do this in a C++ form
project. Is anybody know how to access to my TextBox1 from the
callback?
Make your callback function an instance member of the Form. Take off the
CALLBACK designator. Together, this will make your callback function in
managed code. Define a delegate type matching the EnumWindowsProc (the C#
version on pinvoke.net might be useful for comparison). Use the
Marshal::GetFunctionPointerForDelegate method to have .NET compile the
native shim which contains the hidden "this" handle, and pass the resulting
pointer to EnumWindows (properly cast). Now you can access any of the other
controls and members of your form from inside the callback.

As a side effect, you can again use /clr:pure.
>
Thanks again!

Sep 17 '07 #6

P: n/a

"SQACPP" <ls*********@hotmail.comwrote in message
news:11**********************@w3g2000hsg.googlegro ups.com...
On Sep 17, 3:10 pm, "Ben Voigt [C++ MVP]" <r...@nospam.nospamwrote:
>"SQACPP" <lsdiscip...@hotmail.comwrote in message

news:11**********************@w3g2000hsg.googlegr oups.com...


On Sep 16, 2:06 am, "Jochen Kalmbach [MVP]" <nospam-
Jochen.Kalmb...@holzma.dewrote:
Hi SQACPP!
Error C3641: 'MyEnumWindowsProc' : invalid calling convention
'__stdcall ' for function compiled with /clr:pure or /clr:safe
>Switch the setting in your project to:
"Common language runtime support" to "/clr"
>--
Greetings
Jochen
> My blog about Win32 and .NET
http://blog.kalmbachnet.de/
Thanks! it work with /clr
I'm wondering one another thing about CALLBACK functions....
By example if i want to print something in a textBox from my callback
function how can i access to my textBox ? This->textBox1.Text or
Form1->textBox1.Text are not available in the callback
In other word i'm trying the print the handle or the caption of each
window in a TextBox control and i dont know how to access to my
TextBox from the callback (EnumWindowsProc).
In a console application I can just output (cout) each window handle
to the console but I cant figure out how to do this in a C++ form
project. Is anybody know how to access to my TextBox1 from the
callback?

Make your callback function an instance member of the Form. Take off the
CALLBACK designator. Together, this will make your callback function in
managed code. Define a delegate type matching the EnumWindowsProc (the
C#
version on pinvoke.net might be useful for comparison). Use the
Marshal::GetFunctionPointerForDelegate method to have .NET compile the
native shim which contains the hidden "this" handle, and pass the
resulting
pointer to EnumWindows (properly cast). Now you can access any of the
other
controls and members of your form from inside the callback.

As a side effect, you can again use /clr:pure.


Thanks again!- Hide quoted text -

- Show quoted text -- Hide quoted text -

- Show quoted text -

Afters hours of trying to make the callback function as described I
restart from scratch with a working example found at :
http://www.codeproject.com/managedcpp/cbwijw.asp The only problem is
that this example use /oldSyntax and I manage to convert it to the new
syntax. I'm still trying to figure out how to solve 2 errors and 1
warning.

Original /old syntax source :
http://www.codeproject.com/managedcpp/cbwijw.asp
I don't know that C++/CLI will even allow you to nest an unmanaged class
inside a ref class, in any case the new syntax for __nogc class is simply
"class", no "ref" or "value" prefix.

You could do what David suggested and pass the handle to your form through
the extra parameter provided for your use. To do that, you will need your
original code and GCHandle::Alloc, GCHandle::Target, and GCHandle::Free.
The problem with passing a pointer through unmanaged code is that the
garbage collector might move your form around while running your callback,
then it will adjust the pointer that you received, but the next time the
callback is invoked, it will get the original pointer location which is no
longer valid. GCHandle solves this problem.
Sep 18 '07 #7

P: n/a
On Sep 18, 9:14 am, "Ben Voigt [C++ MVP]" <r...@nospam.nospamwrote:
"SQACPP" <lsdiscip...@hotmail.comwrote in message

news:11**********************@w3g2000hsg.googlegro ups.com...


On Sep 17, 3:10 pm, "Ben Voigt [C++ MVP]" <r...@nospam.nospamwrote:
"SQACPP" <lsdiscip...@hotmail.comwrote in message
>news:11**********************@w3g2000hsg.googlegr oups.com...
On Sep 16, 2:06 am, "Jochen Kalmbach [MVP]" <nospam-
Jochen.Kalmb...@holzma.dewrote:
Hi SQACPP!
Error C3641: 'MyEnumWindowsProc' : invalid calling convention
'__stdcall ' for function compiled with /clr:pure or /clr:safe
Switch the setting in your project to:
"Common language runtime support" to "/clr"
--
Greetings
Jochen
My blog about Win32 and .NET
http://blog.kalmbachnet.de/
Thanks! it work with /clr
I'm wondering one another thing about CALLBACK functions....
By example if i want to print something in a textBox from my callback
function how can i access to my textBox ? This->textBox1.Text or
Form1->textBox1.Text are not available in the callback
In other word i'm trying the print the handle or the caption of each
window in a TextBox control and i dont know how to access to my
TextBox from the callback (EnumWindowsProc).
In a console application I can just output (cout) each window handle
to the console but I cant figure out how to do this in a C++ form
project. Is anybody know how to access to my TextBox1 from the
callback?
Make your callback function an instance member of the Form. Take off the
CALLBACK designator. Together, this will make your callback function in
managed code. Define a delegate type matching the EnumWindowsProc (the
C#
version on pinvoke.net might be useful for comparison). Use the
Marshal::GetFunctionPointerForDelegate method to have .NET compile the
native shim which contains the hidden "this" handle, and pass the
resulting
pointer to EnumWindows (properly cast). Now you can access any of the
other
controls and members of your form from inside the callback.
As a side effect, you can again use /clr:pure.
Thanks again!- Hide quoted text -
- Show quoted text -- Hide quoted text -
- Show quoted text -
Afters hours of trying to make the callback function as described I
restart from scratch with a working example found at :
http://www.codeproject.com/managedcpp/cbwijw.asp The only problem is
that this example use /oldSyntax and I manage to convert it to the new
syntax. I'm still trying to figure out how to solve 2 errors and 1
warning.
Original /old syntax source :
http://www.codeproject.com/managedcpp/cbwijw.asp

I don't know that C++/CLI will even allow you to nest an unmanaged class
inside a ref class, in any case the new syntax for __nogc class is simply
"class", no "ref" or "value" prefix.

You could do what David suggested and pass the handle to your form through
the extra parameter provided for your use. To do that, you will need your
original code and GCHandle::Alloc, GCHandle::Target, and GCHandle::Free.
The problem with passing a pointer through unmanaged code is that the
garbage collector might move your form around while running your callback,
then it will adjust the pointer that you received, but the next time the
callback is invoked, it will get the original pointer location which is no
longer valid. GCHandle solves this problem.- Hide quoted text -

- Show quoted text -
Thanks for your help!

I'm still trying to make the enumwindows works and being able to
display the results of enumWindows in my form (this->listBox2->Items-
>Add(...)
using namespace System::Runtime::InteropServices;
BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lparam)
{
//GCHandle MyThis = GCHandle::FromIntPtr(lparam); //** not
working since LPARAM is not a IntPtr
//Form MyForm= gcnew System::Windows::Forms::; // ** Dont know
how to define a new "this" instance (my form)

// GCHandle gch = GCHandle.FromIntPtr(param);
// TextWriter tw = (TextWriter)gch.Target;
// tw.WriteLine(handle);
return (TRUE);
}

// ....

GCHandle gch = GCHandle::Alloc(this);
// *** NOT WORKING :
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch)); //** not
working since LPARAM is not a IntPtr
EnumWindows(MyEnumWindowsProc,0);
// ....

I need help to understand how to change the lparam param to a IntPtr
without having compiling errors like :

[error C4439: 'AutomationWinForm::MyEnumWindowsProc' : function
definition with a managed type in the signature must have a __clrcall
calling convention]

when i change my the last param of my callback like this : BOOL
CALLBACK MyEnumWindowsProc(HWND hwnd, IntPtr lparam)

and

[error C2664: 'EnumWindows' : cannot convert parameter 1 from 'BOOL
(__stdcall *)(HWND,System::IntPtr)' to 'WNDENUMPROC' ]

when I change the call to enumWindows like this
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch));

Also it still not clear how to define a new instance of my form
(this) :

Really need help!...thanks!
Sep 21 '07 #8

P: n/a
On Sep 21, 4:57 pm, SQACPP <lsdiscip...@hotmail.comwrote:
On Sep 18, 9:14 am, "Ben Voigt [C++ MVP]" <r...@nospam.nospamwrote:


"SQACPP" <lsdiscip...@hotmail.comwrote in message
news:11**********************@w3g2000hsg.googlegro ups.com...
On Sep 17, 3:10 pm, "Ben Voigt [C++ MVP]" <r...@nospam.nospamwrote:
>"SQACPP" <lsdiscip...@hotmail.comwrote in message
>>news:11**********************@w3g2000hsg.googleg roups.com...
On Sep 16, 2:06 am, "Jochen Kalmbach [MVP]" <nospam-
Jochen.Kalmb...@holzma.dewrote:
>Hi SQACPP!
Error C3641: 'MyEnumWindowsProc' : invalid calling convention
'__stdcall ' for function compiled with /clr:pure or /clr:safe
>Switch the setting in your project to:
>"Common language runtime support" to "/clr"
>--
>Greetings
> Jochen
> My blog about Win32 and .NET
> http://blog.kalmbachnet.de/
Thanks! it work with /clr
I'm wondering one another thing about CALLBACK functions....
By example if i want to print something in a textBox from my callback
function how can i access to my textBox ? This->textBox1.Text or
Form1->textBox1.Text are not available in the callback
In other word i'm trying the print the handle or the caption of each
window in a TextBox control and i dont know how to access to my
TextBox from the callback (EnumWindowsProc).
In a console application I can just output (cout) each window handle
to the console but I cant figure out how to do this in a C++ form
project. Is anybody know how to access to my TextBox1 from the
callback?
>Make your callback function an instance member of the Form. Take off the
>CALLBACK designator. Together, this will make your callback function in
>managed code. Define a delegate type matching the EnumWindowsProc (the
>C#
>version on pinvoke.net might be useful for comparison). Use the
>Marshal::GetFunctionPointerForDelegate method to have .NET compile the
>native shim which contains the hidden "this" handle, and pass the
>resulting
>pointer to EnumWindows (properly cast). Now you can access any of the
>other
>controls and members of your form from inside the callback.
>As a side effect, you can again use /clr:pure.
Thanks again!- Hide quoted text -
>- Show quoted text -- Hide quoted text -
>- Show quoted text -
Afters hours of trying to make the callback function as described I
restart from scratch with a working example found at :
>http://www.codeproject.com/managedcpp/cbwijw.asp The only problem is
that this example use /oldSyntax and I manage to convert it to the new
syntax. I'm still trying to figure out how to solve 2 errors and 1
warning.
Original /old syntax source :
>http://www.codeproject.com/managedcpp/cbwijw.asp
I don't know that C++/CLI will even allow you to nest an unmanaged class
inside a ref class, in any case the new syntax for __nogc class is simply
"class", no "ref" or "value" prefix.
You could do what David suggested and pass the handle to your form through
the extra parameter provided for your use. To do that, you will need your
original code and GCHandle::Alloc, GCHandle::Target, and GCHandle::Free.
The problem with passing a pointer through unmanaged code is that the
garbage collector might move your form around while running your callback,
then it will adjust the pointer that you received, but the next time the
callback is invoked, it will get the original pointer location which is no
longer valid. GCHandle solves this problem.- Hide quoted text -
- Show quoted text -

Thanks for your help!

I'm still trying to make the enumwindows works and being able to
display the results of enumWindows in my form (this->listBox2->Items-
Add(...)

using namespace System::Runtime::InteropServices;
BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lparam)
{
//GCHandle MyThis = GCHandle::FromIntPtr(lparam); //** not
working since LPARAM is not a IntPtr
//Form MyForm= gcnew System::Windows::Forms::; // ** Dont know
how to define a new "this" instance (my form)

// GCHandle gch = GCHandle.FromIntPtr(param);
// TextWriter tw = (TextWriter)gch.Target;
// tw.WriteLine(handle);
return (TRUE);

}

// ....

GCHandle gch = GCHandle::Alloc(this);
// *** NOT WORKING :
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch)); //** not
working since LPARAM is not a IntPtr
EnumWindows(MyEnumWindowsProc,0);
// ....

I need help to understand how to change the lparam param to a IntPtr
without having compiling errors like :

[error C4439: 'AutomationWinForm::MyEnumWindowsProc' : function
definition with a managed type in the signature must have a __clrcall
calling convention]

when i change my the last param of my callback like this : BOOL
CALLBACK MyEnumWindowsProc(HWND hwnd, IntPtr lparam)

and

[error C2664: 'EnumWindows' : cannot convert parameter 1 from 'BOOL
(__stdcall *)(HWND,System::IntPtr)' to 'WNDENUMPROC' ]

when I change the call to enumWindows like this
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch));

Also it still not clear how to define a new instance of my form
(this) :

Really need help!...thanks!- Hide quoted text -

- Show quoted text -
Any idea?

Sep 23 '07 #9

P: n/a
I'm still trying to make the enumwindows works and being able to
display the results of enumWindows in my form (this->listBox2->Items-
>>Add(...)

using namespace System::Runtime::InteropServices;
BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lparam)
{
//GCHandle MyThis = GCHandle::FromIntPtr(lparam); //** not
working since LPARAM is not a IntPtr
There's a converting constructor, try GCHandle::FromIntPtr(IntPtr(lparam))
or else GCHandle::FromIntPtr(IntPtr((void*)lparam))
//Form MyForm= gcnew System::Windows::Forms::; // ** Dont know
how to define a new "this" instance (my form)

// GCHandle gch = GCHandle.FromIntPtr(param);
// TextWriter tw = (TextWriter)gch.Target;
// tw.WriteLine(handle);
return (TRUE);
}

// ....

GCHandle gch = GCHandle::Alloc(this);
// *** NOT WORKING :
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch)); //** not
working since LPARAM is not a IntPtr
use GCHandle::ToIntPtr(gch).ToPointer()
EnumWindows(MyEnumWindowsProc,0);
// ....

I need help to understand how to change the lparam param to a IntPtr
without having compiling errors like :

[error C4439: 'AutomationWinForm::MyEnumWindowsProc' : function
definition with a managed type in the signature must have a __clrcall
calling convention]

when i change my the last param of my callback like this : BOOL
CALLBACK MyEnumWindowsProc(HWND hwnd, IntPtr lparam)

and

[error C2664: 'EnumWindows' : cannot convert parameter 1 from 'BOOL
(__stdcall *)(HWND,System::IntPtr)' to 'WNDENUMPROC' ]

when I change the call to enumWindows like this
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch));

Also it still not clear how to define a new instance of my form
(this) :

Really need help!...thanks!


Sep 25 '07 #10

P: n/a
On Sep 25, 2:47 pm, "Ben Voigt [C++ MVP]" <r...@nospam.nospamwrote:
I'm still trying to make the enumwindows works and being able to
display the results of enumWindows in my form (this->listBox2->Items-
>Add(...)
using namespace System::Runtime::InteropServices;
BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lparam)
{
//GCHandle MyThis = GCHandle::FromIntPtr(lparam); //** not
working since LPARAM is not a IntPtr

There's a converting constructor, try GCHandle::FromIntPtr(IntPtr(lparam))
or else GCHandle::FromIntPtr(IntPtr((void*)lparam))
//Form MyForm= gcnew System::Windows::Forms::; // ** Dont know
how to define a new "this" instance (my form)
// GCHandle gch = GCHandle.FromIntPtr(param);
// TextWriter tw = (TextWriter)gch.Target;
// tw.WriteLine(handle);
return (TRUE);
}
// ....
GCHandle gch = GCHandle::Alloc(this);
// *** NOT WORKING :
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch)); //** not
working since LPARAM is not a IntPtr

use GCHandle::ToIntPtr(gch).ToPointer()
EnumWindows(MyEnumWindowsProc,0);
// ....
I need help to understand how to change the lparam param to a IntPtr
without having compiling errors like :
[error C4439: 'AutomationWinForm::MyEnumWindowsProc' : function
definition with a managed type in the signature must have a __clrcall
calling convention]
when i change my the last param of my callback like this : BOOL
CALLBACK MyEnumWindowsProc(HWND hwnd, IntPtr lparam)
and
[error C2664: 'EnumWindows' : cannot convert parameter 1 from 'BOOL
(__stdcall *)(HWND,System::IntPtr)' to 'WNDENUMPROC' ]
when I change the call to enumWindows like this
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch));
Also it still not clear how to define a new instance of my form
(this) :
Really need help!...thanks!- Hide quoted text -

- Show quoted text -
Thanks for still trying to help me!....
BOOL CALLBACK MyEnumWindowsProc(HWND hwnd, LPARAM lparam)
{
GCHandle MyThis = GCHandle::FromIntPtr(IntPtr(lparam)) ;
// ** missing code here to be able to access to my form **//
MyThis->Label1->Text="blabla";
return (TRUE);
}
// ....

GCHandle gch = GCHandle::Alloc(this);
EnumWindows(MyEnumWindowsProc,GCHandle::ToIntPtr(g ch).ToPointer()); //
** Error **//

This code return the error Error C2664: 'EnumWindows' : cannot convert
parameter 2 from 'void *' to 'LPARAM'

instead of printing "blabla" in the label1 of my form each time the
callback proc is called for each windows.

I have no clues about how to recreate a usable form "instance" in my
callback procedure... The following code in the proc is to output to
the console but how to work with a form instead ???
GCHandle gch = GCHandle.FromIntPtr(lparam);
TextWriter tw = (TextWriter)gch.Target;
tw.WriteLine(handle);

Thanks...

Sep 30 '07 #11

This discussion thread is closed

Replies have been disabled for this discussion.