|
I'm using GetIfTable() to find out what network adapters are on a PC and generally it works fine. However, I get some odd results on a few customers' computers.
Normally I get back an array of MIB_IFROW structures, whose dwIndex member are numbered sequentially, starting from 1. For example, on a PC with two network cards I get back something that looks like this:
dwIndex = 1 ; dwType = MIB_IF_TYPE_LOOPBACK
dwIndex = 2 ; dwType = MIB_IF_TYPE_ETHERNET
dwIndex = 3 ; dwType = MIB_IF_TYPE_ETHERNET However, some customers are getting this:
dwIndex = 1 ; dwType = MIB_IF_TYPE_LOOPBACK
dwIndex = 0x00020003 ; dwType = MIB_IF_TYPE_PPP Anyone know what exactly this kind of network adapter is and why it's not identifying itself as MIB_IF_TYPE_ETHERNET?
My understanding of PPP was never real hot but AFAICT, it's a data link layer protocol and so can be used instead of Ethernet (although there is a hack that lets PPP be simulated over an Ethernet network). What common scenarios are out there where people would be running PPP instead of Ethernet?
And why does this guy's adapter have the weird dwIndex. It's almost like it's trying to shove 2 cards into the one MIB_IFROW record
0 bottles of beer on the wall, 0 bottles of beer, you take 1 down, pass it around, 4294967295 bottles of beer on the wall.
Awasu 2.2.5 [^]: A free RSS/Atom feed reader with support for Code Project. 50% discount on the paid editions for CP members!
|
|
|
|
|
I have no personal experience of this enumeration, but PPP is the protocol usually used in dial-up, so I assume that you may see this on computers with dial-up network options.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
cp9876 wrote: PPP is the protocol usually used in dial-up
Hmmm, I seem to have vague memories of that. Jeez, it's been a long time since I was on dial-up
So I guess that means a card could identify itself as Ethernet or PPP depending on what it was plugged in to. Sigh...
0 bottles of beer on the wall, 0 bottles of beer, you take 1 down, pass it around, 4294967295 bottles of beer on the wall.
Awasu 2.2.5 [^]: A free RSS/Atom feed reader with support for Code Project. 50% discount on the paid editions for CP members!
|
|
|
|
|
PPP is normally used over a modem link, so I would have thought that you would see this for modem cards configured for network access (not ethernet cards), but I'm guessing!
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
Hello,
I am a beginning almost done writing my mixed fraction calculator. However, there is a serious arithmetic issue. I need to output mixed fractions that will follow rules of mathematics. For instance, -2 2/3 and -2/5, where the negative sign is in the numerator.
I have some idea about how to implement the algorithm, but some coding or other suggestions/algorithms is appreciated.
My algorithm:
Multiplication and Division: - * - yields +, + * + yields +, otherwise -.
Addition and Subtraction: Convert mixed to improper fraction, and check the sign of that fraction before carrying out the operation.
|
|
|
|
|
As you 'are almost done' it is hard to give advice that will fit your solution. What is the problem you have with adding negative items to your current implementation?
As a general guide, I learnt a lot from Stroustrup's book "The C++ Computing Language" where he detailed a simple calculator program. You could probably adapt his recursive descent parser to your application.
On the other hand, if you only have to handle a few simple cases and are case bashing it, it is 'simply' a matter of adding all the extra cases where '-' signs can occur.
Peter
"Until the invention of the computer, the machine gun was the device that enabled humans to make the most mistakes in the smallest amount of time."
|
|
|
|
|
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <conio.h>
#include <cctype>
using namespace std;
class Mixed
{
public:
Mixed()
{
wholeNum = 0;
num = 0;
denom = 1;
}
Mixed(int w, int a, int b) : wholeNum(w), num(a), denom(b)
{
if((wholeNum < 0) || (num < 0))
setSign = true;
else
setSign = false;
wholeNum += num/denom;
num %= denom;
int div = gcd(num, denom);
num /= div;
denom /= div;
}
Mixed(const Mixed &x)
{
wholeNum = x.wholeNum;
num = x.num;
denom = x.denom;
}
Mixed operator =(const Mixed &x)
{
wholeNum = x.wholeNum;
int div = gcd(x.num, x.denom);
num = x.num/div;
denom = x.denom/div;
return *this;
}
friend ostream& operator <<(ostream& out, const Mixed &x);
friend istream& operator >>(istream& in, Mixed &x);
friend Mixed operator +(const Mixed &x, const Mixed &y);
friend Mixed operator -(const Mixed &x, const Mixed &y);
friend Mixed operator *(const Mixed &x, const Mixed &y);
friend Mixed operator /(const Mixed &x, const Mixed &y);
private:
int wholeNum, num, denom;
bool setSign;
int gcd(int p, int q)
{
return (q==0)? p : gcd(q, p%q);
}
};
Mixed operator +(const Mixed &x, const Mixed &y)
{
int num, denom;
num = (x.wholeNum*x.denom + x.num)*y.denom + (y.wholeNum*y.denom + y.num)*x.denom;
denom = x.denom * y.denom;
return Mixed(0, num, denom); //somewhere within the operator functions, setsign
}
Mixed operator *(const Mixed &x, const Mixed &y)
{
int num, denom;
num = (x.wholeNum*x.denom + x.num)*(y.wholeNum*y.denom + y.num);
denom = x.denom * y.denom;
return Mixed(0, num, denom);
}
Mixed operator -(const Mixed &x, const Mixed &y)
{
int num, denom, mult1, mult2;
if (x.setSign)mult1 = -1;
else mult1 = 1;
if (y.setSign)mult2 = -1;
else mult2 = 1;
num = mult1*((x.wholeNum*x.denom + x.num)*y.denom) - mult2*((y.wholeNum*y.denom + y.num)*x.denom);
denom = x.denom * y.denom;
return Mixed(0, num, denom);
}
Mixed operator /(const Mixed &x, const Mixed &y)
{
int num, denom;
num = (x.wholeNum*x.denom + x.num)*y.denom;
denom = x.denom * (y.wholeNum*y.denom + y.num);
return Mixed(0, num, denom);
}
ostream& operator <<(ostream& out, const Mixed &x)
{
out<<x.wholenum<<" "<<x.num<<'="" '<<x.denom;
="" return="" out;
}
istream&="" operator="">>(istream& in, Mixed &x)
{
char junk;
in>>x.wholeNum>>x.num>>junk>>x.denom;
return in;
}
void operation(char response, Mixed &a, Mixed &b, Mixed &c)
{
switch(response)
{
case '+' : c = a + b;
break;
case '-' : c = a - b;
break;
case '*' : c = a * b;
break;
case '/' : c = a / b;
break;
}
}
int main()
{
char response, sign;
Mixed a, b, c;
do
{
cout<<"Please enter the 2 Mixed Fractions and an operator. (Form w a/b
+ w c/d) \n"
<<"Press N to quit." << endl;
cin >> a >> sign >> b;
operation(sign, a, b, c);
cout << "The anwser is: " << c << endl;
cout << "Do you want to run this program again? (Y/N)" << endl;
cin >> response;
}while(toupper(response)!='N');
system("pause");
return 0;
}
Problem arises from:
int num, denom, mult1, mult2;
if (x.setSign)mult1 = -1;
else mult1 = 1;
if (y.setSign)mult2 = -1;
else mult2 = 1;
What I attempt to do is to check whether the user inputs a negative mixed number, and if he did, I will manipulate accordingly.
Mixed(int w, int a, int b) : wholeNum(w), num(a), denom(b)
{
if((wholeNum < 0) || (num < 0))
setSign = true;
else
setSign = false;
wholeNum += num/denom;
num %= denom;
int div = gcd(num, denom);
num /= div;
denom /= div;
}
The program compiles, but I am getting a logical error. The answers are totally wrong. My program works fine with without the "burden" of following rules of arithmetic. So I hope someone can suggest where my code went wrong.
Thanks.
|
|
|
|
|
|
Armond Sarkisian wrote: In the Edit I have an about..
Shouldn't this be under the Help menu?
Armond Sarkisian wrote: When the user clicks on the about option, how do I get another form to pop-up. Is there a ShowWindow function?
Create an instance of a CDialog -derived object, and call its DoModal() method.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
|
how can you make an app be able to send and recieve custom window messages between the windows (or even between two applications assuming you have the appropriate window handle)
Can you just use a integer in the Message parameter that isn't already used? If so, what are the ranges of unused window message values?
Or do you have to do special code to "register" or w/e the custom window message?
Thanks
|
|
|
|
|
See here: WM_APP Notification[^]
You'll probably want to use RegisterWindowMessage() to get a system-unique message ID if posting
between separate processes.
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Is custom window messages supported in Window Vista also ? Or any changes in it ?
|
|
|
|
|
I sure hope so! Otherwise, alot of software will need to be rewritten
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Have a look at this[^] article.
It describes exactly what you should and why you should do it that way.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
|
|
My project is an MFC application; i am running into an application crash when user tries to select an object from the browse window. This does not happened when the user tries to do it with a single click, this happens only when user tries to drag the object a little bit while selecting. I have an option of making a copy of the object when the user tries to drag and drop it, but if the right click and drag is bit fast then the application crashes.
Crash happens at the line DISABLEOLEWARNINGBOXS,
<br />
void CInstanceListCtrl::OnBegindrag(NMHDR* , LRESULT* pResult) <br />
{<br />
*pResult = 0;<br />
<br />
if (0 == m_dropEffectAllowed) return;<br />
<br />
CPyrItemList* ppil = CreateSelectedItemList (m_fIgnoreClassFoldersInLists);<br />
if (NULL == ppil) return;<br />
<br />
DISABLEOLEWARNINGBOXS;<br />
<br />
CPyrItemListDataSource DataSource;<br />
DataSource.Create (*ppil);<br />
DataSource.DoDragDrop (m_dropEffectAllowed);<br />
delete ppil;<br />
}<br />
and DISABLEOLEWARNINGBOXS refers to
<br />
#define DISABLEOLEWARNINGBOXS \<br />
COleMessageFilter* pfilter = ::AfxOleGetMessageFilter (); \<br />
if (NULL != pfilter) \<br />
{ \<br />
pfilter->EnableBusyDialog(FALSE); \<br />
pfilter->EnableNotRespondingDialog(FALSE); \<br />
}<br />
the call stack shows
mfc71d.dll!AfxAssertValidObject(const CObject * pOb=0x00000000, const char * lpszFileName=0x7c142b9c, int nLine=33) Line 75 C++
mfc71d.dll!AfxOleGetMessageFilter() Line 33 + 0x15 C++
Util.dll!CInstanceListCtrl::OnBegindrag(tagNMHDR * __formal=0x03f5a9ac, long * pResult=0x03f5a664) Line 2590 + 0x5 C++
mfc71d.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x03f5c444, unsigned int nID=0, int nCode=65427, void (void)* pfn=0x0072db00, void * pExtra=0x03f5a3d0, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 119 C++
mfc71d.dll!CCmdTarget::OnCmdMsg(unsigned int nID=0, int nCode=65427, void * pExtra=0x03f5a3d0, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 396 + 0x27 C++
mfc71d.dll!CWnd::ReflectChildNotify(unsigned int uMsg=78, unsigned int wParam=1024, long lParam=66431404, long * pResult=0x03f5a664) Line 3251 + 0x23 C++
mfc71d.dll!CWnd::OnChildNotify(unsigned int uMsg=78, unsigned int wParam=1024, long lParam=66431404, long * pResult=0x03f5a664) Line 3205 C++
mfc71d.dll!CListCtrl::OnChildNotify(unsigned int message=78, unsigned int wParam=1024, long lParam=66431404, long * pResult=0x03f5a664) Line 606 + 0x18 C++
mfc71d.dll!CWnd::SendChildNotifyLastMsg(long * pResult=0x03f5a664) Line 3145 C++
mfc71d.dll!CWnd::ReflectLastMsg(HWND__ * hWndChild=0x000307b8, long * pResult=0x03f5a664) Line 3183 C++
mfc71d.dll!CWnd::OnNotify(unsigned int __formal=1024, long lParam=66431404, long * pResult=0x03f5a664) Line 2569 + 0xd C++
SelDlg.dll!0136999e()
mfc71d.dll!CWnd::OnWndMsg(unsigned int message=78, unsigned int wParam=1024, long lParam=66431404, long * pResult=0x03f5a698) Line 1771 + 0x28 C++
mfc71d.dll!CWnd::WindowProc(unsigned int message=78, unsigned int wParam=1024, long lParam=66431404) Line 1745 + 0x1e C++
mfc71d.dll!AfxCallWndProc(CWnd * pWnd=0x03f5b0b4, HWND__ * hWnd=0x000307de, unsigned int nMsg=78, unsigned int wParam=1024, long lParam=66431404) Line 241 + 0x1a C++
mfc71d.dll!AfxWndProc(HWND__ * hWnd=0x000307de, unsigned int nMsg=78, unsigned int wParam=1024, long lParam=66431404) Line 389 C++
Can someone suggest me how to get around this problem?
Anil
|
|
|
|
|
The first thing I would do is change that macro to function. You can then step into the function to better find the source of your error.
You may be right I may be crazy -- Billy Joel --
Within you lies the power for good, use it!!!
|
|
|
|
|
AnilUnni wrote: COleMessageFilter* pfilter = ::AfxOleGetMessageFilter (); \
First statement in this function is,
ASSERT_VALID(AfxGetThread());
And in your case AfxGetThread is returning NULL pointer. Need to find that cause.
|
|
|
|
|
Yes Prasad you are correct.
I changed the code so that in case of exception it returns without a crash.
try
{
COleMessageFilter* pfilter = ::AfxOleGetMessageFilter (); \
if (NULL != pfilter) \
{ \
pfilter->EnableBusyDialog(FALSE); \
pfilter->EnableNotRespondingDialog(FALSE); \
}
}
catch(...)
{
return;
}
I guess this should work?
|
|
|
|
|
If think, instead of this, NULL check would be better option,
ie.
if ( AfxGetThread())
{
COleMessageFilter* pfilter = ::AfxOleGetMessageFilter (); \
if (NULL != pfilter) \
{ \
pfilter->EnableBusyDialog(FALSE); \
pfilter->EnableNotRespondingDialog(FALSE); \
}
}
Because, NULL pointer access will simply cause crash, instead of throwing exception.
|
|
|
|
|
Anyone know how to make a C++ dll that Cold Fusion can access?
|
|
|
|
|
I don't know CF, but most non-C languages require that the functions be exported as C functions with undecorated names, like:
extern "C" __declspec(dllexport) int SomeFunc(); C linkage is the lowest-common-denominator when it comes to exports.
|
|
|
|
|
Hi,
How can I get the reference of a already launched visual studio IDE
in the Window OS and automate it in my program ?
Thanks
|
|
|
|
|