|
Hey all, I was wondering how I might go about mixing a C++ dll with C# windows form.
I am currently creating a C++ dll to use within another application that allows scripts to call into dlls, for a fun/learning project. Though I have been able to figure out how to perform simple function calls, I am a bit clueless as to how I might go adding GUI components into the mix. In the end I would like to able to add a toolbar to the outside application. Ideally, because it is so simple to create windows forms in C#, I would like to be able to create the toolbar in C# and have it call my dll functions. Though I have done some searching, I am a bit lost on where to even begin.
As a first step, I would like to write a simple function in my C++ dll that creates a simple HelloWorld windows form (script calls dll's helloWorld -> dll creates C# form). Though I can do either by itself, I am not sure how to call the form from within the dll, as well as how to go about having C# and C++ in the same visual studio project. If anyone could point me in the right direction, I would be very thankful.
|
|
|
|
|
I'm trying to write an application that, upon startup or resizing, will resize one other, or several other windows (So that my application shares the screen on the right.) I also need to resize the displayed programs when I close or minimize my application. For that matter, where do I specify where my window is placed on startup?
|
|
|
|
|
Basically the process involves two steps.... 1. getting a handle to the window you want to resize 2. resizing it
I think your best way is to go
HWND wnd = FindWindow(strWindowClassName, strWindowName);
if(wnd != NULL)
{
MoveWindow(wnd, X, Y, width, height, TRUE);
}
else TRACE0("Window Not Found!"); Try that. You will need your window's name - that's what you see on the title bar, and you'll need it's class name - you can get that with Microsoft Spy++ which comes with Visual Studio. If you really can't get the class name then use NULL.
Joel Holdsworth
Wanna give me a job this summer?
Check out my online CV and project history[^] - now available in MSWord format![^]
|
|
|
|
|
I tried this suggestion and found two errors:
error C2440: 'initializing' : cannot convert from 'class CWnd *' to 'struct HWND__ *'
error C2661: 'MoveWindow' : no overloaded function takes 6 parameters
How should I resolve these?
(I put it in PreCreate Window, to start)
Also, you said that the window's name is what you see on the title bar. What about for programs like internet explorer, where what you see on the title bar changes depending on what page you are on, or where in the program you are?
|
|
|
|
|
Ok... you're using MFC. I think if you put <ocde>:: in front of both function calls, that should sort you out!
HWND wnd = ::FindWindow(strWindowClassName, strWindowName);
if(wnd != NULL)
{
::MoveWindow(wnd, X, Y, width, height, TRUE);
}
else TRACE0("Window Not Found!");
Joel Holdsworth
Wanna give me a job this summer?
Check out my online CV and project history[^] - now available in MSWord format![^]
|
|
|
|
|
Can anyone explain what is happening here? I am trying to create overloaded relational operators for class member enums. VC6.0 and gcc 3.3.4 compile the code fine. VC7.0 and 7.1 complain that the overloaded operator function is ambiguous. The following code illustrates the problem:
class A
{
public:
enum level
{
none, low, medium, high
};
};
bool operator>( A::level l1, A::level l2 )
{
bool greater = false;
switch( l1 )
{
case A::low:
switch( l2 )
{
case A::none: greater = true; break;
}
break;
case A::medium:
switch( l2 )
{
case A::low:
case A::none: greater = true; break;
}
break;
case A::high:
switch( l2 )
{
case A::medium:
case A::low:
case A::none: greater = true; break;
}
break;
}
return greater;
}
int
main( int argc, char * argv[] )
{
A::level l1 = A::high;
A::level l2 = A::low;
if( l1 < l2 )
{
return 1;
}
if( l1 > l2 )
{
return -1;
}
return 0;
}
VC6.0 and gcc compile cleanly. VC7.0 and 7.1 fail with the following error:
Compiling...
enumtest.cpp
d:\misc\test.cpp(54) : error C2593: 'operator >' is ambiguous
d:\misc\test.cpp(13): could be 'bool operator >(A::level,A::level)'
or 'built-in C++ operator>(A::level, A::level)'
while trying to match the argument list '(A::level, A::level)'
What are the built-in operators mentioned? Is the compiler assuming that an enum-is-an-enum-is-an enum, and thus bypasses the strong typing? What is the correct way to write this that conforms to the standard and is portable?
Any and all insights will be welcome.
|
|
|
|
|
struct employee
{
int emp_id;
char name[20];
};
void main()
{
struct employee *A;
struct employee **B;
B = &A;
//how do i access the emp_id and name field of **B
}
how can i change the emp_id and the name field of **B? th complier allowes me to write A->name = "whatever"; but it doesnt allow me to write b->name = "whatever";.
|
|
|
|
|
try
(*B)->emp_id = 0;
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
Mridang Agarwal wrote:
how can i change the emp_id and the name field...
In your example, you cannot. Doing so would yield an access violation because an instance of the employee structure does not exist.
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
I have used part of this code from a tutorial I found on this website and I am now trying to adapt it into being useful for my program to use the data it recieves. I am probably doing totally the wrong thing as some of it I don't really understand yet as I am fairly new to c++. I know the data that is being recieved is "START" as it echos the data into the console so that I can see it. However when I come to the if statements it is not proccessing the data and echoing back the statements I want it to. The code is below for the part of the program which proccesses the data. I know the rest of the program works it is just using the data in the if statments. If you need any more information please just ask and I will try to provide it to you as best as I cant. Thanks in advance to anyone that helps.
UINT ClientThread(LPVOID pParam)
{
char buff[512];
CString cmd;
CString params;
int n;
BOOL auth=false;
SOCKET client=(SOCKET)pParam;
strcpy(buff,"#Server Ready.\r\n");
send(client,buff,strlen(buff),0);
while(true)
{
n=recv(client,buff,512,0);
if(n==SOCKET_ERROR )
break;
buff[n]=0;
std::cout << "Data: " << buff;
if(buff=="QUIT")
{
std::cout << "QUIT Command Recieved\r\n";
break;
}
if(buff=="START")
{
cout << "Start Command Recieved\r\n";
}
closesocket(client);
return 0;
}
}
|
|
|
|
|
You can't compare strings like that. Use the strcmp() method.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ok thanks,
I will try looking at that.
|
|
|
|
|
I have done a little search on google for the command and come up with a few things but would you mind showing me how I could actually use it in my situation. As far as I understand it only compares whether a string is greater or less than the other one or am I wrong?
|
|
|
|
|
nvm I managed to figure it out.
|
|
|
|
|
Hi
I am relatively new to Minidumps & WinDbg. I work on a GUI application developed on VS.Net 2003 (unmanaged code) where I have added a handler for Unhandled Exceptions using SetUnhandledExcpetionFilter. The handler function creates Minidumps. (this code was found in codeproject: http://www.codeproject.com/debug/postmortemdebug_standalone1.asp)
For testing purposes, I made the app crash due to Null ptr reference in one of the screens. The problem is that when I open the dump file in WinDbg, it does not show complete stack trace.
I use WinDbg as the default debugger; So it was interesting to see that when I remove the unhandled exception handler and let the app crash, WinDbg takes over and at that time, it shows
complete stack trace for the same code. So I don't understand what I am missing when creating / viewing the minidump.
Can anyone please help? I highly appreciate any help/ideas from your side.
Thanks
Jay
|
|
|
|
|
|
Hi,
I'm using Chris MFC GridCtrl in my app in a dll.
My App is working fine in debug mode.
But as soon as I call the diolog (inside dll) - which is using the grid control - in release mode, my app crashes?
Has anyone had made the same experience, or has an idea, or even better a fix for that problem?
I've no idea how to fix this! Pressing the Retry-Button of the Assertion Dialog stops at:
-----------------------------------------------------
AFXWIN1.INL:
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()
{ ASSERT(afxCurrentInstanceHandle != NULL);
return afxCurrentInstanceHandle; }
-----------------------------------------------------
Thanks Ralph
[Reply][Email][View Thread][Get Link] [Modify|Delete]
|
|
|
|
|
So are you showing a dialog from inside the DLL? If so, have you used the AFX_MANAGE_STATE macro at the top of the method that uses the dialog?
Or if you are using a dialog that is stored inside the DLL from your EXE, have you called AfxSetResourceHandle() to tell MFC where to find the dialog template?
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Thanks for your reply!
I've already used the AFX_MANAGE_STATE macro before.
Now I've inserted the AfxSetResourceHandle() call, but the Assertion appeared in the same way.
I'm not sure, but I guess the resource handling should not differ between debug and release mode, or I'm wrong?
Regards Ralph
|
|
|
|
|
|
as the name says, it is when you lose some memory segments.
actually, it is when the memory is not well managed by a program, and is not entierly restituted to the system as "free" when the program leaves... this way, it cannot be re-used by another process...
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
OK, I have an error in my application and somehow seem to corrupt the stack.
I have done a search on Google for a market overview. And what really really bothers me is that it seems that all vendors stopped developing their tools years ago. No new functions, no update, no nothing
I found:
- Purify
- Insure++
- BoundsChecker
- and some others.
Question:
Can you recommend me an actively supported and developed tool for checking all kind of programming errors like memory leaks, cross-threading issues, pointer issues, stack issues and so on?
--
Affordable Windows-based CMS for only 99 €: try www.zeta-producer.com for free!
|
|
|
|
|
At work we use purify, and it works quite good and is a pretty fast solution for finding memory related problems.
I tried boundschecker and its also pretty good, it integrate several error checking capabilities like the thing you mentioned, and more (deadlock detection, call validation, object tracking, .NET analysis ...)
Papa
while (TRUE)
Papa.WillLove ( Bebe ) ;
|
|
|
|
|
Thank you, I will try purify! Is it still being activly developed with new versions?
--
Affordable Windows-based CMS for only 99 €: try www.zeta-producer.com for free!
|
|
|
|
|
I know that they are currently working on new features in Purify plus
Papa
while (TRUE)
Papa.WillLove ( Bebe ) ;
|
|
|
|