|
Nope, there's no handler at all in the view for WM_SETCURSOR...
And while checking what you mentioned, I realized that I had no call to ::SetCursor(). Duh!
It's fixed now.
------- sig starts
"I've heard some drivers saying, 'We're going too fast here...'. If you're not here to race, go the hell home - don't come here and grumble about going too fast. Why don't you tie a kerosene rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Hi,
I am trying to remove a device using the fn,bOk = SetupDiRemoveDevice(hDevInfo,devinfoData[n1]);
as soon as I do this, (I think there are some bugs in its driver) it gets to the found new hardware wizard, and recreats the registries ( for I want to remove that device and delete the registries).
How do I overcome this. I know we can tell device manager to send me all the devices messages so that when I get new hardware message, I can ignore it.
Can anyone help me how to do that?
Thanks in advance.
|
|
|
|
|
Hi, I would like to learn how to change registry entries from a MFC (dialog based) application. I am trying to disable the Task Manager when my application loads and disable it before I exit.
Any help would be greatly apperciated. Thanks,
This is the entry i'm trying to change:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]---->DisableTaskMgr
|
|
|
|
|
Use RegSetValueEx(.....) to set the registry value
cheers,
Super
------------------------------------------
Too much of good is bad,mix some evil in it
|
|
|
|
|
Thanks Super, that worked!
|
|
|
|
|
I am using Visual C++ 6.0. I have an MFC Dialog based application. I have an class derived from CDialog called CIntrument that has edit controls. Each edit control has a unique IDD_EDIT identifier and have unique variables defined as Value CString. In a different CDialog box I instantiate an object of type 'CInstrument Inst'. I then use fscanf() to read text from a file into the member variables Inst.m_var_a, Inst.m_var_b, Inst.m_var_c and others. As each item of text is read ALL the member variables change to the value that was just read. I have verified this while stepping through the code one line at a time. I am very confused as to why variables with completely different names would be modified in this fashion.
Thanks
Buck
|
|
|
|
|
Open the resource.h and the .rc file using the text editor and confirm that each edit control really does have a unique ID and that that ID is really a unique value.
Next, check DoDataExchange and verify that the controls and the member variables are being assigned correctly.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Yes, everything seems to be the way you would expect it.
Buck
|
|
|
|
|
Darn, then I'm at a loss without looking at the source.
Could it have to do with how fscanf() is being used?
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Here are the two header and two cpp files. The code that is causing me problems is in the ListOfInstrumentsDlg::OnInitDialog() function at the bottom of this posting.
// Instrument.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
class CInstrument : public CDialog
{
// Construction
public:
CInstrument(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CInstrument)
enum { IDD = IDD_DIALOG_INSTRUMENT };
CString m_GPIB;
CString m_Name;
CString m_Type;
CString m_Channels;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CInstrument)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CInstrument)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_INSTRUMENT_H__E23BF332_8005_4295_B743_DDC7DC952923__INCLUDED_)
********************************************************
********************************************************
// Instrument.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
CInstrument::CInstrument(CWnd* pParent /*=NULL*/)
: CDialog(CInstrument::IDD, pParent)
{
//{{AFX_DATA_INIT(CInstrument)
m_GPIB = _T("");
m_Name = _T("");
m_Type = _T("");
m_Channels = _T("");
//}}AFX_DATA_INIT
}
void CInstrument::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInstrument)
DDX_Text(pDX, IDC_EDIT_GPIB, m_GPIB);
DDX_Text(pDX, IDC_EDIT_NAME, m_Name);
DDX_Text(pDX, IDC_EDIT_TYPE, m_Type);
DDX_Text(pDX, IDC_EDIT_CHANNELS, m_Channels);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInstrument, CDialog)
//{{AFX_MSG_MAP(CInstrument)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
********************************************************
********************************************************
//
// ListOfInstrumentsDlg.h header file
#include "Instrument.h"
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
class CListOfInstrumentsDlg : public CDialog
{
// Construction
public:
CListOfInstrumentsDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListOfInstrumentsDlg)
enum { IDD = IDD_LISTOFINSTRUMENTS_DIALOG };
CListBox m_ListInstruments;
CString m_Transfer;
CString m_Add;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListOfInstrumentsDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
CInstrument Inst;
private:
// CArray<cinstrument, cinstrument&=""> InstArray;
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListOfInstrumentsDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDblclkListInstruments();
afx_msg void OnBtnTransfer();
afx_msg void OnBtnAdd();
afx_msg void OnBtnDelete();
afx_msg void OnBtnNew();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LISTOFINSTRUMENTSDLG_H__11140619_DB17_44D5_BA7D_0A965B24C920__INCLUDED_)
********************************************************
********************************************************
// ListOfInstrumentsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "ListOfInstrumentsDlg.h"
#include "NewInstrument.h"
//#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
CListOfInstrumentsDlg::CListOfInstrumentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CListOfInstrumentsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CListOfInstrumentsDlg)
m_Transfer = _T("");
m_Add = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CListOfInstrumentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CListOfInstrumentsDlg)
DDX_Control(pDX, IDC_LIST_INSTRUMENTS, m_ListInstruments);
DDX_Text(pDX, IDC_EDIT_TRANSFER, m_Transfer);
DDX_Text(pDX, IDC_EDIT_ADD, m_Add);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CListOfInstrumentsDlg, CDialog)
//{{AFX_MSG_MAP(CListOfInstrumentsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_DBLCLK(IDC_LIST_INSTRUMENTS, OnDblclkListInstruments)
ON_BN_CLICKED(IDC_BTN_TRANSFER, OnBtnTransfer)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
ON_BN_CLICKED(IDC_BTN_NEW, OnBtnNew)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg message handlers
BOOL CListOfInstrumentsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// CString* m_InstrumentType;
// CString* m_InstrumentName;
// CString* m_GPIB;
// CString* m_Channels;
CString* m_Comma;
CString* m_Return;
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", Inst.m_Type);
// fscanf(infile, "%[^,]", &m_InstrumentType);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_Name);
// fscanf(infile, "%[^,]", &m_InstrumentName);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_GPIB);
// fscanf(infile, "%[^,]", &m_GPIB);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^\n]", Inst.m_Channels);
// fscanf(infile, "%[^\n]", &m_Channels);
fscanf(infile, "%[\n]", &m_Return);
// InstArray.Add();
if (feof(infile))
end_of_file = 1;
}
return TRUE; // return TRUE unless you set the focus to a control
}
Buck
|
|
|
|
|
Of immediate concern, and I think the ultimate cause, is that you are using the CString variables directly, without getting the buffers. This is overwriting the null string the CString variables point to by default.
You should do:
fscanf(infile, "%s", Inst.m_Type.GetBuffer(32));<br />
Inst.m_Type.ReleaseBuffer();
This is rather unsafe since it assumes it will read only 32 characters.
With VS 2007, you could do:
fscanf_s(infile, "%s", Inst.m_Type.GetBuffer(32), 32);<br />
Inst.m_Type.ReleaseBuffer();
If you know they are numbers, I'd use int s rather than CStrings and change the fscanf to:
fscanf(infile, "%d", &Inst.m_Type);
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
-- modified at 17:14 Wednesday 22nd February, 2006
|
|
|
|
|
Thanks,
Because my file is comma delimited with variable length fields, some with white space in them I used the approach below. Works great!
Buck
CString in_buffer;
char buffer[32];
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_Type = in_buffer;
fscanf(infile, "%[,]", &buffer);
fscanf(infile, "%[^,]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_Name = in_buffer;
fscanf(infile, "%[,]", &buffer);
fscanf(infile, "%[^,]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_GPIB = in_buffer;
fscanf(infile, "%[,]", &buffer);
fscanf(infile, "%[^\n]", &buffer);
in_buffer.Format("%s", &buffer);
Inst.m_Channels = in_buffer;
fscanf(infile, "%[\n]", &buffer);
m_ListInstruments.AddString(Inst.m_Name);
if (feof(infile))
end_of_file = 1;
}
Buck
|
|
|
|
|
Maybe you could save yourself some duplicate effort.
Could you replace this:
fscanf(infile, "%[,]", &buffer);<br />
fscanf(infile, "%[^\n]", &buffer);<br />
in_buffer.Format("%s", &buffer);<br />
Inst.m_Channels = in_buffer;
with this, for example:
fscanf(infile, "%[,]", &buffer);<br />
fscanf(infile, "%[^\n]", &buffer);<br />
Inst.m_Channels.Format("%s", &buffer);
That is one less string copy and memory adjustment.
You would not need or use the in_buffer at all.
People that start writing code immediately are programmers (or hackers), people that ask questions first are Software Engineers - Graham Shanks
|
|
|
|
|
Difficult to say without seeing the code... Can you post it?
|
|
|
|
|
Here are the two header and two cpp files. The code that is causing me problems is in the ListOfInstrumentsDlg::OnInitDialog() function at the bottom of this posting.
// Instrument.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
class CInstrument : public CDialog
{
// Construction
public:
CInstrument(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CInstrument)
enum { IDD = IDD_DIALOG_INSTRUMENT };
CString m_GPIB;
CString m_Name;
CString m_Type;
CString m_Channels;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CInstrument)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CInstrument)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_INSTRUMENT_H__E23BF332_8005_4295_B743_DDC7DC952923__INCLUDED_)
********************************************************
********************************************************
// Instrument.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
CInstrument::CInstrument(CWnd* pParent /*=NULL*/)
: CDialog(CInstrument::IDD, pParent)
{
//{{AFX_DATA_INIT(CInstrument)
m_GPIB = _T("");
m_Name = _T("");
m_Type = _T("");
m_Channels = _T("");
//}}AFX_DATA_INIT
}
void CInstrument::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInstrument)
DDX_Text(pDX, IDC_EDIT_GPIB, m_GPIB);
DDX_Text(pDX, IDC_EDIT_NAME, m_Name);
DDX_Text(pDX, IDC_EDIT_TYPE, m_Type);
DDX_Text(pDX, IDC_EDIT_CHANNELS, m_Channels);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInstrument, CDialog)
//{{AFX_MSG_MAP(CInstrument)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
********************************************************
********************************************************
//
// ListOfInstrumentsDlg.h header file
#include "Instrument.h"
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
class CListOfInstrumentsDlg : public CDialog
{
// Construction
public:
CListOfInstrumentsDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListOfInstrumentsDlg)
enum { IDD = IDD_LISTOFINSTRUMENTS_DIALOG };
CListBox m_ListInstruments;
CString m_Transfer;
CString m_Add;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListOfInstrumentsDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
CInstrument Inst;
private:
// CArray<cinstrument, cinstrument&=""> InstArray;
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListOfInstrumentsDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDblclkListInstruments();
afx_msg void OnBtnTransfer();
afx_msg void OnBtnAdd();
afx_msg void OnBtnDelete();
afx_msg void OnBtnNew();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LISTOFINSTRUMENTSDLG_H__11140619_DB17_44D5_BA7D_0A965B24C920__INCLUDED_)
********************************************************
********************************************************
// ListOfInstrumentsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "ListOfInstrumentsDlg.h"
#include "NewInstrument.h"
//#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
CListOfInstrumentsDlg::CListOfInstrumentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CListOfInstrumentsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CListOfInstrumentsDlg)
m_Transfer = _T("");
m_Add = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CListOfInstrumentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CListOfInstrumentsDlg)
DDX_Control(pDX, IDC_LIST_INSTRUMENTS, m_ListInstruments);
DDX_Text(pDX, IDC_EDIT_TRANSFER, m_Transfer);
DDX_Text(pDX, IDC_EDIT_ADD, m_Add);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CListOfInstrumentsDlg, CDialog)
//{{AFX_MSG_MAP(CListOfInstrumentsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_DBLCLK(IDC_LIST_INSTRUMENTS, OnDblclkListInstruments)
ON_BN_CLICKED(IDC_BTN_TRANSFER, OnBtnTransfer)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
ON_BN_CLICKED(IDC_BTN_NEW, OnBtnNew)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg message handlers
BOOL CListOfInstrumentsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// CString* m_InstrumentType;
// CString* m_InstrumentName;
// CString* m_GPIB;
// CString* m_Channels;
CString* m_Comma;
CString* m_Return;
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", Inst.m_Type);
// fscanf(infile, "%[^,]", &m_InstrumentType);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_Name);
// fscanf(infile, "%[^,]", &m_InstrumentName);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_GPIB);
// fscanf(infile, "%[^,]", &m_GPIB);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^\n]", Inst.m_Channels);
// fscanf(infile, "%[^\n]", &m_Channels);
fscanf(infile, "%[\n]", &m_Return);
// InstArray.Add();
if (feof(infile))
end_of_file = 1;
}
return TRUE; // return TRUE unless you set the focus to a control
}
Buck
|
|
|
|
|
What does the fscanf() statement look like?
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
|
|
|
|
|
Here are the two header and two cpp files. The code that is causing me problems is in the ListOfInstrumentsDlg::OnInitDialog() function.
// Instrument.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
class CInstrument : public CDialog
{
// Construction
public:
CInstrument(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CInstrument)
enum { IDD = IDD_DIALOG_INSTRUMENT };
CString m_GPIB;
CString m_Name;
CString m_Type;
CString m_Channels;
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CInstrument)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CInstrument)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_INSTRUMENT_H__E23BF332_8005_4295_B743_DDC7DC952923__INCLUDED_)
********************************************************
********************************************************
// Instrument.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CInstrument dialog
CInstrument::CInstrument(CWnd* pParent /*=NULL*/)
: CDialog(CInstrument::IDD, pParent)
{
//{{AFX_DATA_INIT(CInstrument)
m_GPIB = _T("");
m_Name = _T("");
m_Type = _T("");
m_Channels = _T("");
//}}AFX_DATA_INIT
}
void CInstrument::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInstrument)
DDX_Text(pDX, IDC_EDIT_GPIB, m_GPIB);
DDX_Text(pDX, IDC_EDIT_NAME, m_Name);
DDX_Text(pDX, IDC_EDIT_TYPE, m_Type);
DDX_Text(pDX, IDC_EDIT_CHANNELS, m_Channels);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInstrument, CDialog)
//{{AFX_MSG_MAP(CInstrument)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
********************************************************
********************************************************
//
// ListOfInstrumentsDlg.h header file
#include "Instrument.h"
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
class CListOfInstrumentsDlg : public CDialog
{
// Construction
public:
CListOfInstrumentsDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListOfInstrumentsDlg)
enum { IDD = IDD_LISTOFINSTRUMENTS_DIALOG };
CListBox m_ListInstruments;
CString m_Transfer;
CString m_Add;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListOfInstrumentsDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
CInstrument Inst;
private:
// CArray<cinstrument, cinstrument&=""> InstArray;
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListOfInstrumentsDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDblclkListInstruments();
afx_msg void OnBtnTransfer();
afx_msg void OnBtnAdd();
afx_msg void OnBtnDelete();
afx_msg void OnBtnNew();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_LISTOFINSTRUMENTSDLG_H__11140619_DB17_44D5_BA7D_0A965B24C920__INCLUDED_)
********************************************************
********************************************************
// ListOfInstrumentsDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ListOfInstruments.h"
#include "ListOfInstrumentsDlg.h"
#include "NewInstrument.h"
//#include "Instrument.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg dialog
CListOfInstrumentsDlg::CListOfInstrumentsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CListOfInstrumentsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CListOfInstrumentsDlg)
m_Transfer = _T("");
m_Add = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CListOfInstrumentsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CListOfInstrumentsDlg)
DDX_Control(pDX, IDC_LIST_INSTRUMENTS, m_ListInstruments);
DDX_Text(pDX, IDC_EDIT_TRANSFER, m_Transfer);
DDX_Text(pDX, IDC_EDIT_ADD, m_Add);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CListOfInstrumentsDlg, CDialog)
//{{AFX_MSG_MAP(CListOfInstrumentsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_DBLCLK(IDC_LIST_INSTRUMENTS, OnDblclkListInstruments)
ON_BN_CLICKED(IDC_BTN_TRANSFER, OnBtnTransfer)
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
ON_BN_CLICKED(IDC_BTN_NEW, OnBtnNew)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListOfInstrumentsDlg message handlers
BOOL CListOfInstrumentsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// CString* m_InstrumentType;
// CString* m_InstrumentName;
// CString* m_GPIB;
// CString* m_Channels;
CString* m_Comma;
CString* m_Return;
FILE* infile;
char* config_file = "Config.txt";
infile = fopen(config_file, "r");
int end_of_file = 0;
CInstrument Inst;
// Here is where the input read from the Config.txt file and stored in the respective variables.
while (!end_of_file)
{
fscanf(infile, "%[^,]", Inst.m_Type);
// fscanf(infile, "%[^,]", &m_InstrumentType);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_Name);
// fscanf(infile, "%[^,]", &m_InstrumentName);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^,]", Inst.m_GPIB);
// fscanf(infile, "%[^,]", &m_GPIB);
fscanf(infile, "%[,]", &m_Comma);
fscanf(infile, "%[^\n]", Inst.m_Channels);
// fscanf(infile, "%[^\n]", &m_Channels);
fscanf(infile, "%[\n]", &m_Return);
// InstArray.Add();
if (feof(infile))
end_of_file = 1;
}
return TRUE; // return TRUE unless you set the focus to a control
}
Buck
|
|
|
|
|
99% of this code is unnecessary to describe your problem. In the future, please try to trim away as much as you can before posting. That goes a long way in obtaining help.
BuckBrown wrote: FILE* infile;
char* config_file = "Config.txt";
Just curious, but why are you using FILE* and char* with MFC? It's syntactically correct, but not necessary.
BuckBrown wrote: fscanf(infile, "%[^,]", Inst.m_Type);
The first thing to do is separate CString from fscanf() . While they technically can be made to work together, it's messy and not worth the trouble.
char szText[128];
fscanf(infile, "%[^,]", szText);
Inst.m_Type = szText; BuckBrown wrote: fscanf(infile, "%[,]", &m_Comma);
This will never work as m_Comma is a pointer that does not point to a valid memory address. To eat the comma, just add it to the fscanf() statement:
fscanf(infile, "%[^,],", szText);
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
|
|
|
|
|
i'm using plain winapi and i'm trying to find out which items are selected
in a multi-selection listview window. i need this for "remove all selected items"
functionality.
(1) i could walk down all items and check if an item is selected.
but that would take very long with big lists (linear time)
(2) i could also track selection changes inside the window procedure but
i guess this would slow down selecting/unselecting items noticebly.
also it would be a lot of extra coding.
isn't there some easy, fast and elegant way to get a list of all selected items?
a listbox provides a message for this - listview does not?
please help!
thanks in advance, sebastian
-------------------------------------------
My website: http://www.hartwork.org
|
|
|
|
|
My first guess would be to use LVM_FINDITEM to find selected items...
Be sure to turn off redrawing during the delete operations to improve performance.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|
thanks for your quick reply!
i overlooked LVM_FINDITEM somehow...
DavidCrow suggested LVM_GETNEXTITEM instead:
i compared these two and LVM_FINDITEM seems more
powerful so expect more speed from LVM_GETNEXTITEM .
also thanks for the tip on redrawing!
-------------------------------------------
My website: http://www.hartwork.org
|
|
|
|
|
Sebastian Pipping wrote: i need this for "remove all selected items"
functionality.
Make sure you delete from the bottom-up (e.g., largest item to the smallest item).
Sebastian Pipping wrote: (1) i could walk down all items and check if an item is selected.
but that would take very long with big lists (linear time)
Use the LVM_GETNEXTITEM message for this?
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
|
|
|
|
|
thanks for you quick reply!
i am using LVM_GETNEXTITEM now.
i stumbled over the line "The specified item is itself excluded from the search"
on MSDN, and modified my code so it works with top-down deletion:
iWalk = SendMessage( _hView, LVM_GETNEXTITEM, iWalk - 1, LVNI_SELECTED );
-------------------------------------------
My website: http://www.hartwork.org
|
|
|
|
|
Hi ...
I have written a Windows Service using ATL COM (ATL3 / Visual Studio 6.0). The service works fine, I am able to start and stop the service.
I have created a COM Class called CTest with a methof called TestBeep(). I would like to access this object and call the method from the CServiceModule::Run() method.
Below is the CServiceModule::Run() Method.
The code will fail on both attempts to create the ITest* pTest using CoCreateInstance(). The error message are written to the event log
"Error: ITest failed"
"CoCreateInstance failed"
Any help is appreciated,
Thanks,
Chris
void CServiceModule::Run()<br />
{<br />
_Module.dwThreadID = GetCurrentThreadId();<br />
<br />
HRESULT hr = CoInitialize(NULL);<br />
<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
CSecurityDescriptor sd;<br />
sd.InitializeFromThreadToken();<br />
hr = CoInitializeSecurity(sd, -1, NULL, NULL,<br />
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
LogEvent(_T("Blue Service started"));<br />
LogEvent(_T("Message 1"));<br />
LogEvent(_T("Message 2"));<br />
<br />
if (m_bService)<br />
SetServiceStatus(SERVICE_RUNNING);<br />
<br />
MSG msg;<br />
while (GetMessage(&msg, 0, 0, 0))<br />
DispatchMessage(&msg);<br />
<br />
_Module.RevokeClassObjects();<br />
<br />
<br />
<br />
char progID[] = "Blue.Test.1";<br />
<br />
CLSID clsid;<br />
wchar_t wide[80]; <br />
mbstowcs(wide, progID, 80);<br />
CLSIDFromProgID(wide, &clsid);<br />
<br />
LogEvent(_T("Attempt to use ITest"));<br />
<br />
ITest* pTest = NULL;<br />
if(SUCCEEDED(CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_ITest, (void**)&pTest)))<br />
{<br />
pTest->TestBeep(); <br />
}<br />
else<br />
{ <br />
LogEvent(_T("Error: ITest failed"));<br />
} <br />
<br />
<br />
<br />
CComPtr<ITest> pObj;<br />
hr = pObj.CoCreateInstance(OLESTR("Blue.Test.1"));<br />
if( SUCCEEDED(hr) )<br />
{<br />
hr = pObj->TestBeep();<br />
if( SUCCEEDED(hr) )<br />
{ <br />
LogEvent(_T("Call to ITest was successful"));<br />
}<br />
else<br />
{ <br />
LogEvent(_T("Error: ITest failed"));<br />
} <br />
}<br />
<br />
if( FAILED(hr) )<br />
{ <br />
LogEvent(_T("CoCreateInstance failed"));<br />
}<br />
<br />
CoUninitialize();<br />
}<br />
<br />
This is the implementation of the CTest Class and the TestBeep() method
<br />
#ifndef __TEST_H_<br />
#define __TEST_H_<br />
<br />
#include "resource.h"
<br />
class ATL_NO_VTABLE CTest : <br />
public CComObjectRootEx<CComSingleThreadModel>,<br />
public CComCoClass<CTest, &CLSID_Test>,<br />
public IDispatchImpl<ITest, &IID_ITest, &LIBID_BLUELib><br />
{<br />
public:<br />
CTest()<br />
{<br />
}<br />
<br />
DECLARE_REGISTRY_RESOURCEID(IDR_TEST)<br />
<br />
DECLARE_PROTECT_FINAL_CONSTRUCT()<br />
<br />
BEGIN_COM_MAP(CTest)<br />
COM_INTERFACE_ENTRY(ITest)<br />
COM_INTERFACE_ENTRY(IDispatch)<br />
END_COM_MAP()<br />
<br />
public:<br />
STDMETHOD(TestBeep)();<br />
STDMETHOD(GetCount)();<br />
int nCount;<br />
};<br />
<br />
#endif //__TEST_H_<br />
<br />
<br />
<br />
#include "stdafx.h"<br />
#include "Blue.h"<br />
#include "Test.h"<br />
<br />
<br />
<br />
STDMETHODIMP CTest::GetCount()<br />
{<br />
<br />
return S_OK;<br />
}<br />
<br />
STDMETHODIMP CTest::TestBeep()<br />
{<br />
Beep(4000, 200); <br />
Beep(1000, 50); <br />
Beep(4000, 200); <br />
Beep(1000, 50); <br />
return S_OK;<br />
}<br />
<br />
Thanks,
Chris
|
|
|
|
|
I want to take a bunch of unit test files from an LGPL opensource project, include them in my _closed_ project, modify them a bit and use it to test parts of my application. Can I do this?
thanks!
|
|
|
|
|