|
Compile the release version with multithreaded DLL support.
Kuphryn
|
|
|
|
|
Is this a DLL of yours or a third party. Are you linking to the release build of the DLL and if it uses MFC is it compiled to use the same build type (single/multithread/DLL/static etc.) as your app.
Neville Franks, Author of ED for Windows. www.getsoft.com
Make money with our new Affilate program
|
|
|
|
|
I already solved the problem myself. It was very interesting. The Microsoft compiler unloads the DLL before I can call any function of it. It doesn't do that in the debug version. I really don't know why MSCV++ does this... I disabled the speed "optimizations" of the compiler and now it works very well!
Anyway thanks for your help
-Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
|
|
|
|
|
Your solution doesn't sound right to me and I think you still have a problem. I've never seen VC++ code or Windows unload a DLL for no good reason. Are you using LoadLibrary() to load the DLL or normal linking.
Neville Franks, Author of ED for Windows. www.getsoft.com
Make money with our new Affilate program
|
|
|
|
|
Neville Franks wrote:
Your solution doesn't sound right to me and I think you still have a problem.
At least I cannot see any problems in debug and release version any more. Also, I don't have memory leaks.
A working, dirty solution is better than a clean, not-working solution .
Neville Franks wrote:
I've never seen VC++ code or Windows unload a DLL for no good reason.
Me too. I've also never seen this behavior before.
Here is what exactly happenED (not any more): I load the DLL (works, I get a valid, non-NULL handle), then I get 3 functions of it (works, all function pointers are non-NULL). I have to call the first function one time, the second function about 200 times, and the last function one time. The first function worked very well. The problem now was, that when I call the second function, I can call this only once. When I attempt to make a second call to the second function, the pointer points to the last function. But I didn't change the pointer! The compiler must have done this. So instead of calling the second function again, it calls the third. After the third call, the DLL automatically unloads. What now happens is clear: the next call to the DLL function will crash the app.
I know this sounds stupid and more like a simple programming error. But I am sure there is no error by my side. I also have never seen this behaviour before. It cannot be a programming error, because now, after I disabled the optimizations, it works very fine.
This is not my first project dealing with libraries, I've build at least 5 projects which use DLLs before!
Neville Franks wrote:
Are you using LoadLibrary() to load the DLL or normal linking.
LoadLibrary, yes. The library is built with Dev-C++/GCC, the main project with MSVC++ (please don't ask why we make the DLL with Dev-C++/GCC... ).
-Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
|
|
|
|
|
Yes it all sounds very strange. Are you sure the function pointers weren't getting corrupted?
Neville Franks, Author of ED for Windows. www.getsoft.com
Make money with our new Affilate program
|
|
|
|
|
100% for sure. I assign them once to the return value of GetProcAddress and never touch them again except using them as function calls.
-Dominik
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
|
|
|
|
|
Dominik Reichl wrote:
100% for sure. I assign them once to the return value of GetProcAddress and never touch them again except using them as function calls.
Yes but it is always possible that some piece of erant code changed the pointer values. It would be worth checking this.
Neville Franks, Author of ED for Windows. www.getsoft.com
Make money with our new Affilate program
|
|
|
|
|
Friends,
I wrote a simple template function, the purpose was to convert a "string" to "number" (just like atoi function). My function is:
namespace CP
{
template < class T >
T ToNum(std::string &strNum)
{
T num=0;
std::stringstream strm ( strNum );
strm >> num;
return num;
}
}
As you can see above, the function ToNum is present inside a namespace.
In order to use this function in the main program, there are three methods to deal with namespaces. First method is:
using namespace CP;
std::string strNum=_T("44");
std::cout << ToNum<int>(strNum)
The above method is working fine in which i initially used using namespace CP before anything else.
There is second method which is also working for me. Instead of using using namespace CP , i am directly calling the function ToNum as:
CP::ToNum<int>(strNum)
But the third method is not working for me what i am doing is:
using CP::ToNum;
ToNum<_int64>(strNum);
But strangely it is not working and compiler is giving me horrible STL errors like,
c:\test\test.cpp(32): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'overloaded-function' (or there is no acceptable conversion)
Please tell me what is the problem ?????
|
|
|
|
|
Try this
#include <iostream>
int main(int argc, char* argv[])
{
_int64 a = 10;
std::cout << a << std::endl;
return 0;
}
in my system it is not working too.
Probably, the broble is in _int64,
not in yor function.
================================
Useful links
|
|
|
|
|
I need help. i must be such a retard i dont understand. I'm making an MFC SDI app, with a CButton object in the view. in OnInitialUpdate i am ::Create() ing the object fine, and ShowWindow() ing fine. The button appears... now how do i simply make an AfxMessageBox for when i click on this button!?
I've read about subclassing and it seems like it might be the way to go but i just *cant* get it to work. Any help would be appreciated...
|
|
|
|
|
You need to handle the ON_BN_CLICKED message generated by the button. The easiest way to do this is to use the class wizard to automagically generate the code for you. Then in your message handler do
AfxMessageBox(_T("Your Message here."));
- Nitron
"Those that say a task is impossible shouldn't interrupt the ones who are doing it." - Chinese Proverb
|
|
|
|
|
Thanks, but i'm not sure that helps. The classwizard doesn't offer any mapping abilities for my object...
In the View.h i have...
CButton myButton;
then in the cpp i have
myButton.Create("Test", WS_CHILD, CRect(0,0,50,50), <br />
AfxGetMainWnd(), WM_USER+1);<br />
myButton.ShowWindow(SW_SHOW);
If i go to the classwizard, under the "Message Maps" tab, i select the View as the Class Name, but then what? Theres no reference to my button anywhere.
Thanks for the help though mate, i appreciate it. any more thoughts?
-BigSteiny
|
|
|
|
|
Bigsteiny wrote:
If i go to the classwizard, under the "Message Maps" tab, i select the View as the Class Name, but then what? Theres no reference to my button anywhere.
Nor should there be. ClassWizard is obviously not going to know about a control that is created at run-time.
What is your view based on?
|
|
|
|
|
Based on? Um. It just used the AppWizard and made an SDI application.
The control is created at run time, but it's declared at compile time... not sure if this makes a difference though...
Thanks.
-Az.;)
|
|
|
|
|
Bigsteiny wrote:
Based on? Um. It just used the AppWizard and made an SDI application.
Yes, but what base class was the view derived from? If you did not change any of the defaults, it's probably going to be CView. Other types are CFormView, CListView, CEditView, CHtmlView, CRichEditView, CScrollView, and CTreeView.
Besides the list control, are you going to want other controls displayed on the view?
|
|
|
|
|
The best way to do this is to create a class derived from CButton.
class CMyButton : public CButton
{
// class members go here
}; // end class
And then in your MFC application you declare a member variable:
CMyButton *pButton;
Then you procceed by creating the button and showing it.
To handle messages simply go to classwizard and select CMyButton. You will be able to see the list of messages that your class can handle.
// Afterall I realized that even my comment lines have bugs
|
|
|
|
|
Arrggh! No good i'm afraid.
I made a class called MyButton which inherits from CButton fine. made it ok. Create-ed it fine, ShowWindow-ed fine.... i even got the class wizard to apparently map the OnLButtonDown.. but when i click on it - it does nothing. The code never executes?! Help!
<br />
BEGIN_MESSAGE_MAP(MyButton, CButton)<br />
ON_WM_LBUTTONDOWN()<br />
END_MESSAGE_MAP()<br />
<br />
protected:<br />
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);<br />
<br />
void MyButton::OnLButtonDown(UINT nFlags, CPoint point) <br />
{<br />
AfxMessageBox("You Clicked LButton on MyButton class");<br />
<br />
CButton::OnLButtonDown(nFlags, point);<br />
}<br />
That's basically whats been added... but it doesn't work. Any thoughts? Thanks for the help.
|
|
|
|
|
Because you are creating the control using Create() , you are going to have to add the MESSAGE_MAP entries manually to get this to work.
// in header file
afx_msg void OnMyButton()
in the MESSAGE_MAP
ON_BN_CLICKED(ID_OF_CREATED_BUTTON, OnMyButton)
void CYourClass::OnMyButton()
{
AfxMessageBox("I hope this works!");
}
Roger Allen
Sonork 100.10016
Were you different as a kid? Did you ever say "Ooohhh, shiny red" even once? - Paul Watson 11-February-2003
|
|
|
|
|
I must be doing something wrong but i don't know what. So here's all of it..
Thanks for the patience.
<br />
<br />
#include "MyButton.h"<br />
class CTstButtonView : public CView<br />
{<br />
protected:
CTstButtonView();<br />
DECLARE_DYNCREATE(CTstButtonView)<br />
<br />
public:<br />
CTstButtonDoc* GetDocument();<br />
MyButton* myButton;<br />
public:<br />
virtual void OnDraw(CDC* pDC);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);<br />
virtual void OnInitialUpdate();<br />
<br />
public:<br />
virtual ~CTstButtonView();<br />
#ifdef _DEBUG<br />
virtual void AssertValid() const;<br />
virtual void Dump(CDumpContext& dc) const;<br />
#endif<br />
<br />
protected:<br />
<br />
protected:<br />
DECLARE_MESSAGE_MAP()<br />
};<br />
<br />
<br />
void CTstButtonView::OnInitialUpdate() <br />
{<br />
CView::OnInitialUpdate();<br />
<br />
myButton = new MyButton;<br />
myButton->Create("Test", WS_CHILD, CRect(0,0,50,50), AfxGetMainWnd(), WM_USER+1);<br />
myButton->ShowWindow(SW_SHOW);<br />
}<br />
<br />
class MyButton : public CButton<br />
{<br />
public:<br />
MyButton();<br />
<br />
<br />
public:<br />
virtual ~MyButton();<br />
<br />
protected:<br />
afx_msg void OnMyButton();<br />
<br />
DECLARE_MESSAGE_MAP()<br />
};<br />
<br />
<br />
<br />
MyButton::MyButton()<br />
{<br />
}<br />
<br />
MyButton::~MyButton()<br />
{<br />
}<br />
<br />
<br />
BEGIN_MESSAGE_MAP(MyButton, CButton)<br />
ON_BN_CLICKED(WM_USER+1, OnMyButton)<br />
END_MESSAGE_MAP()<br />
<br />
void MyButton::OnMyButton()<br />
{<br />
AfxMessageBox("My Function!");<br />
}<br />
<br />
|
|
|
|
|
You dont need to inherit from CButton to handle the click event of your button
All you have to do is to add a button notification handler in the view class for the id of your button, and ensure that the button's id is unique in order not to conflict with other controls. This code should explain it:
class CTstButtonView : public CView
{
.
.
CButton m_btn;
afx_msg void MyButtonHandler();
.
.
};
BEGIN_MESSAGE_MAP(CTstButtonView , CView)
.
.
ON_BN_CLICKED(ID_MYBUTTON, MyButtonHandler)
.
.
END_MESSAGE_MAP()
void CTstButtonView::OnInitialUpdate()
{
CView::OnInitialUpdate();
if(!m_btn.GetSafeHwnd())
m_btn.Create("TEST", WS_CHILD|WS_VISIBLE, CRect(0,0, 200, 100), this, ID_MYBUTTON);
}
void MyButtonHandler()
{
AfxMessageBox("My Function!");
}
note that in your code you made the parent window of the button is the main window which is the CMainFrame class, if you want it this way you may need to move the handler function and handler message map to the CMainFrame instead of the CView
|
|
|
|
|
Another note concerning the code of you derived CButton class. The code did not work becuase the BN_CLICKED message is not sent to the button, this message is sent to the parent of the button. Therefore the message is not sent to the button in the first place.
|
|
|
|
|
Right, i'd actually alread tried that method too... and it didn't work. I tried swapping the mapping from my custom class, to the view and still didn't work. The problem was...
<br />
m_btn.Create("TEST", WS_CHILD|WS_VISIBLE, CRect(0,0, 200, 100), this, <br />
ID_MYBUTTON)<br />
<br />
as opposed to my<br />
<br />
m_btn.Create("TEST", WS_CHILD|WS_VISIBLE, CRect(0,0, 200, 100), AfxGetMainWnd(), <br />
ID_MYBUTTON)<br />
should have seen this.
Thanks for the help everyone.
|
|
|
|
|
We do a lot of user interface software, often small applications.
In order to speed up design is it possible to add to the palette in the dialgoue editor ? The one where the edit box, list control etc. appear ?
Either in VC++6.0 or VS.NET.
Thanks.
Elaine
The tigress is here
|
|
|
|
|
Well, not to the dialog editor.
But try to use the component gallery.
G. Steudtel
|
|
|
|
|