|
wow, very helpful...
explains why C++ is such a powerful language... it's almost as if the entire language can change pretty quickly depending on all of your own settings... that's crazy!!
and the memory allocation seems understandable as well now that you explain it like that... basically if you specifically ask for new memory, you've got to deal with it yourself...
Thanks a bunch MicroVirus... i'm looking to release my first CodeProject Article on this project in the coming months... i'll be sure to mention your help!
|
|
|
|
|
I have a program source code, want, who can help me! Thank you, give me your e-mail.
|
|
|
|
|
I am a noob just starting out trying to code extensions for IE, and I have an ATL project with a BHO working with very basic functionality right now. I have a button that displays in the IE Menu toolbar, but need to show a form when the user clicks the button and be able to submit and process data. I have been researching this a lot but am at a loss as to what the best approach would be. There seem to be no tutorials online for this. Has anyone done this before?
|
|
|
|
|
I was reading http://msdn.microsoft.com/en-us/library/bb250489.aspx[^] after I saw your post. Scrolling down to around 2/3 of the page under the heading Responding to Events, there is the following:
From MSDN:
Finally, add a simple OnDocumentComplete event handler.
void STDMETHODCALLTYPE CHelloWorldBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
HWND hwnd;
HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
if (SUCCEEDED(hr))
{
MessageBox(hwnd, L"Hello World!", L"BHO", MB_OK);
}
}
Notice that the message box uses the top-level window of the site as its parent window, rather than simply passing NULL in that parameter. In Internet Explorer 6, a NULL parent window does not block the application, meaning that the user can continue to interact with the browser while the message box is waiting for user input. In some situations, this can cause the browser to hang or crash. In the rare case that a BHO needs to display a UI, it should always ensure that the dialog box is application modal by specifying a handle to the parent window.
Basically, where the MessageBox is, is *any* dialog box you want or create. The actual creation and display of the dialog inside a BHO is exactly the same as for a normal windows application. Just be sure to set the parent to the browser hWnd, as is suggested by this article.
So, to learn how to do this, all you need to do is learn how to display a dialog in a normal 32 bits application. And then hook it up to your BHO and display it at the right time.
|
|
|
|
|
Hi,
I have created a Class CProgressDlg, derived from CDialog, which encapsulates the thread creation, message sending, cancel button, etc. associated a Dialog with one or more Progress Bar(s). The whole lot was compiled into an MFC Extension DLL, and I wrote an equivalent Header file which hides all the uglies needed to implement the class.
The exposed Class Declaration is as follows:
-
class CProgressDlg : public CDialog
{
DECLARE_DYNAMIC( CProgressDlg )
virtual ~CProgressDlg();
public:
PFN_DLG_PROGRESS_THREADPROC SetProgressProcedure(PFN_DLG_PROGRESS_THREADPROC pFn);
void OnCancel();
BOOL ShouldTerminate();
CProgressDlg(UINT nIDTemplate,CWnd* pParent =NULL); protected:
virtual void DoDataExchange(CDataExchange* pDX); void UpdateData(BOOL bSaveAndValidate = TRUE);
void EndDialog(int ExitCode);
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
private:
char Reserved[16];
};
I Tried to Use this code as Follows:-
class CBackupDlg : public CProgressDlg
{
public:
DWORD ProcessAllFiles(void*);
CBackupDlg(CWnd* pParent = NULL); enum { IDD = IDD_ACTIONDLG };
CProgressCtrl m_cProgressCtrl;
CString m_sDataRemainung;
CString m_sProcessStage;
CString m_sFileNowProcessing;
CString m_sTimeRemaining;
protected:
virtual void DoDataExchange(CDataExchange* pDX); protected:
DECLARE_MESSAGE_MAP()
};
The CPP File has the Following :-
CBackupDlg::CBackupDlg(CWnd* pParent )
: CProgressDlg(CBackupDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_qwCopySize=0;
}
BEGIN_MESSAGE_MAP(CBackupDlg, CProgressDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BROWSE_DEST, OnBrowseDest)
ON_BN_CLICKED(IDC_BROWSE_SOURCE, OnBrowseSource)
ON_BN_CLICKED(IDC_BROWSE_SUBDIR, OnBrowseSubdir)
END_MESSAGE_MAP()
When Compiling I get the following Errors:-
At the Initialiser:
error C2614: 'CBackupDlg' : illegal member initialization: 'CProgressDlg' is not a base or member
At BEGIN_MESSAGE_MAP
error C2248: 'messageMap' : cannot access protected member declared in class 'CProgressDlg'
What is going on here. The Same Headers and Code has been used numerous times. The ProgressDlg Header is included via StdAfx.h, so, should be visible everywhere. I've gone over the code time and time again. Can't find anything out of Order.
By the way, Everything Compiles Fine if I replace CProgressDlg with CDialog in the Initialiser and the MESSAGE_MAP Macro. Ofcourse If I try to run with that, I get Run Time Errors as Expected.
Pulling out my hair at this stage, Any helpfull comment is appreciated.
Regards
Bram van Kampen
modified on Sunday, August 21, 2011 6:46 AM
|
|
|
|
|
I'm not an MFC expert but should the line
DECLARE_DYNAMIC( CProgressDlg )
not be public?
|
|
|
|
|
Richard MacCutchan wrote: I'm not an MFC expert but should the line
DECLARE_DYNAMIC( CProgressDlg )
not be public?
Well,
DECLARE_DYNAMIC() is defined in the Microsoft 'AFX.H' as follows:-
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
It sets it's own inheritance Access Model Prepending it with 'public' should not (and does not) have any effect. Actually, looking at the macro above, The DECLARE_DYNAMIC(...) macro causes all following properties to be declared public by default. The CPP language has no(t yet)(a) syntax to 'push' or 'pop' the 'public', 'protected', 'private' storage type 'state'.
I made a stupid error there somewhere, that upsets the Class Hierarchie as perceived by the compiler.
Thanks
Bram van Kampen
|
|
|
|
|
I have always found these MFC macros more than somewhat confusing - great if they work, but almost impossible to debug.
|
|
|
|
|
Is CProgressDlg inside any namespace that you need to use?
|
|
|
|
|
How to add Common Controls 6.0 to DLL / ATL ?
I don't have the source code of the EXE, I'm writing only the DLL linked to it.
If I put this line in the stdafx.h of the DLL it doesn't work:
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
InitCommonControls(); / InitCommonControlsEx();
is not working neither,
I need Common Controls 6.0 to show my tooltips controls and they work only with the manifestdependency line at the exe file / or manifest file to exe
Thanks for anyone who can help,
Mithrill
|
|
|
|
|
How can I check whether an iterator was assigned a value or not? In other words, if I create an iterator with default constructor what value will it present which I could check against?
It is not the trivial case such this:
list<int>::iterator it;
but this:
map<AClass *,list<int>::iterator> aci;
AClass *ptr=someinitializedaclassptr;
if(aci[ptr]==UNINITIALIZED_ITERATOR)
{
dosomething();
}
In above example issuing aci[ptr] creates already an entry in the map with default constructed value list<int>::iterator if there isn't a key of value ptr .
modified on Friday, August 5, 2011 7:48 AM
|
|
|
|
|
|
Well, it is obvious it has no special value as int val; . The problem is how to check this. I'll try the below code:
#include "list"
#include "map"
#include "iostream"
using namespace std;
int main()
{
list<int>::iterator it,itnull;
map<int,list<int>::iterator> imap;
it = imap[1]; if(it==itnull) cout<<"it unitialized"<<endl; else
cout<<"it has other value"<<endl;
return 0;
}
|
|
|
|
|
So I am digging around deep in the registry
So far so good, but I need to access specifics for each subkey
for (i=0; i<cSubKeys; i++) {
cbName = MAX_KEY_LENGTH;
retCode = RegEnumKeyEx(hKey, i, achKey, &cbName, 0, 0, 0, &ftLastWriteTime);
if (retCode == ERROR_SUCCESS) {
RegQueryValueEx(hKey,L"DisplayName",NULL,NULL,(LPBYTE) lpData, &buffersize);
applist.push_back(lpData);
}
}
Anyway all I get are a bunch of "-" so am I getting the right type etc?
http://www.contract-developer.tk
|
|
|
|
|
What are the types of lpData and applist ?
The best things in life are not things.
|
|
|
|
|
I added another layer of hKey
lpData is char*
applist is CString
I got it figured out with a lot more code needed
http://www.contract-developer.tk
|
|
|
|
|
Are you sure that lpData is big enough to hold the returned value? What is the value of buffersize when you call the query function? Also, I do not see a push_back() method for either CString or CStringT classes; are you sure this is what you mean?
The best things in life are not things.
|
|
|
|
|
I'm guessing both lpData as applist need to be wide (unicode). You are using the wide version of RegQueryValueEx so for string values you are (I think) returned the unicode/wide version.
|
|
|
|
|
Hi Guys,
I am having one application(Windows service) that was working fine with VS 2003,i am compiling this application with Visual Studio pro 2008 and getting linker error for WNetCancelConnection2.
To supress linker error i have added MPR.LIB,it all work fine but whe its been deployed to server it was giving error
"Dependent Assembly Microsoft.VC80.MFC could not be found and Last Error was
The referenced assembly is not installed on your system ".
can somebody help me here.
thanks
vikas da
|
|
|
|
|
You need to get the runtime libraries installed on your server. See the link in this message[^].
The best things in life are not things.
|
|
|
|
|
Hi,
I have been trying to adopt certain new MFC classes(version-10.0) into my application (written based on MFC 7.0 originally).
A brief of the context is as below.
I have an application with the main window class, CMainFrame derived from CMDIFrameWnd, and the toolbars created from CToolBar.
These ToolBars are fitted into objects of a class called CMyDialogBar. CMyDialogBar is derived from CDialogBar (which is a child of CControlBar, as you know).
In order to serialize the dock information, in one of the Dlls of my application, CDockState object is used in the code. A pointer to the application's main window is retrieved using AfxGetMainWnd() and dynamic casted to CFrameWnd, and methods like GetDockState() etc. are called against it. Also, CControlBarInfo pointer is used to get each control bar information from CDockState object, and remove a couple of them from the list based on some specific logic before
saving it for persisting.
Now starts the real problem.
I need to incorporate CMFCToolBar instead of CToolBar, and the application's main window is changed to derive from CMDIFrameWndEx instead of CMDIFrameWnd.CMyDialogBar class is now altered to derive from 'CDockablePane' (instead of CDialogBar) as I found in some forums.
I get debug assertion failures, wherever CControlBarInfo is used, and wherever GetDockState() or SetDockState() is called since those methods refer to CControlbar objects/pointers internally.
Sample code from dll, is as shown here:
void CDialogBarService::RestoreState()
{
CFrameWnd* pWnd = DYNAMIC_DOWNCAST( CFrameWnd, OldStyleAfxGetMainWnd());
pWnd->PostMessage( WM_STATUS_UPDATE, 0, 0);
ASSERT( pWnd != NULL);
CDockState state;
CMyContext context;
CMwSession session;
CProxyUser* pUser = session.GetUserProxy();
if ( pUser != NULL && pUser->GetInstrProfileContext( NAME_LAYOUT_DIALOG_BAR_SERVICE, context) )
{
if ( context.Exists( NAME_TOOLBAR_STATE) )
{
CByteArray data;
if ( context[NAME_TOOLBAR_STATE].Get( data) )
{
CRawByteFile file( data.GetSize(), data.GetData());
CArchive ar( &file, CArchive::load);
state.Serialize( ar);
}
}
for ( int i = state.m_arrBarInfo.GetUpperBound(); i >= 0 ; i-- )
{
CControlBarInfo* pInfo = reinterpret_cast< CControlBarInfo*>( state.m_arrBarInfo[i]);
ASSERT( pInfo != NULL);
pInfo->m_pBar = pWnd->GetControlBar( pInfo->m_nBarID);
if ( pInfo->m_pBar == NULL )
{
CControlBarInfo* pState = reinterpret_cast< CControlBarInfo*>( state.m_arrBarInfo[i]);
state.m_arrBarInfo.RemoveAt( i);
delete pState;
}
}
pWnd->SetDockState( state);
}
}
In the above sample code, i even tried to replace CFrameWnd pointer to CMDIFrameWndEx pointer, but the method call SetDockState() was giving compilation error, since it is made protected in the new MFC class hierarchy. Since i am standing in a dll, i cannot have my CMainFrame class instantiated here, to call a public method or overridden member function, which in turn can invoke the protected member.
Questions-
1. Which class i can use for replacing CControlBarInfo in the context of DockablePanes?
2. Why those methods like SetDockState(), GetDockingManager() etc. made protected for CMDIFrameWndEx class in new hierarchy?
3. Is there any other mechanism/classes using which i could achieve the above persistence?
Thanks in advance.
Regards
Syamlal
SYAMLAL
|
|
|
|
|
I recently switched to VS2010 and its a big pain. I understand it is more standards compliant etc., but it also seems incredibly fragile. The linker crashes often, the thing that compiled fine yesterday won't compile today, despite me not changing anything. If I leave my compilation running while locking the computer VS2010 crashes. All in all the whole product seems flaky.
Anyway to specifics:
How can I get rid of the MSB8012 warning? Why does MS insist on thinking it knows what I want better than I do? Output a DLL to a non-standard location and it starts freaking out. Also doesn't seem to like relative paths much in these settings.
Is there a way to turn off the use of the path macros?
I also keep getting:
error LNK1318: Unexpected PDB error; ACCESS_DENIED (15)
Even though the PDB in question is for a different product and nothing is using it and it isn't read-only.
Any one know anything about that?
Bring back VS6!
|
|
|
|
|
Make sure you install the service packs (I do believe SP1 is out for VS2010), I use VS2008 and have not major complaints after the first service pack.
Kyudos wrote: How can I get rid of the MSB8012 warning?
Use a #pragma warning( disable: WARNING_NUMBER ) statement
Kyudos wrote: Output a DLL to a non-standard location and it starts freaking out.
I do this all the time in VS2008 and it has no problem with it, wouldn't imagine they changed that very much from one release to another.
Kyudos wrote: error LNK1318: Unexpected PDB error; ACCESS_DENIED (15)
These are the type of random errors you sometimes experience pre-service packs...
I hope your experience with VS2010 gets better, I've seen a lot of improvements from the usability stand point and the better standard C++ compliance is certainly a great step forward for MS. Good luck!
|
|
|
|
|
Thanks Albert - I downloaded SP1 and now have a different set of problems!
At first my application would crash the development environment every time I tried to debug (F5),
so I decided to do a full rebuild.
Now one of my Fortran libraries won't compile, because it appears to be looking for a dependent library in a weird place:
fatal error LNK1181: cannot open input file 'C:\Program Files\Microsoft Visual Studio 10.0\Common7\...'
I can't seem to find anything that would make it look there for lib files.
Any ideas?
EDIT: Ah - Fortran problem!
Solution[^]
modified on Sunday, July 17, 2011 11:56 PM
|
|
|
|
|
So you got your linker problems resolved?
|
|
|
|
|