|
Please share you money with us...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Hi,
I need to let admin-user to change local area connection properties with in the program.
the program is written in mfc/c++.
currently i have an ugly piece of code that works only if i know the type of the card - as you can see in the OR statement. I found out that wireless cars always have "Wireless" in their name, however I couldn't find anything similar for LAN cards, any ideas?
Thanks!
Sky
CString LanIp,WLanIp;
CString Descr,ServiceName;
DWORD regEnumIndex = 0;
DWORD IPwasChanged = FALSE;
CString Value;
CRegistry Reg (HKEY_LOCAMACHINE);
CStringArray IpConfigPath;
CString IpAddress;
CString Key1("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\");
CString Key2("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
CEntity *Entity = m_pMgr->GetMyEntity();
if(Entity != NULL)
{
((CLanEntity *)Entity)->GetLanIP(LanIp);
((CLanEntity *)Entity)->GetWLanIP(WLanIp);
IPwasChanged = FALSE;
while(1)
{
if(Reg.EnumKey(Key1,regEnumIndex,Value) == FALSE)
break;
Reg.Get(Key1 + Value,"Description", Descr);
if(Descr.Find("Wireless") >= 0)
{
if(WLanIp == "0.0.0.0" || WLanIp == "")
continue;
Reg.Get(Key1 + Value,"ServiceName", ServiceName);
Reg.Get(Key2 + ServiceName,"IPAddress", IpAddress);
if(WLanIp == IpAddress)
continue;
Reg.Set(Key2 + ServiceName,"IPAddress", WLanIp);
Reg.Set(Key2 + ServiceName,"SubNetMask", _T("255.255.255.0"));
Reg.Set(Key2 + ServiceName,"IPAutoconfigurationEnabled", 0);
Reg.Set(Key2 + ServiceName,"EnableDHCP", 0);
IPwasChanged = TRUE;
}
if(Descr.Find("PRO/100") >= 0 || Descr.Find("Realtek") >= 0 || Descr.Find("Marvel") >= 0)
{
if(LanIp == "0.0.0.0" || LanIp == "")
continue;
Reg.Get(Key1 + Value,"ServiceName", ServiceName);
Reg.Get(Key2 + ServiceName,"IPAddress", IpAddress);
if(LanIp == IpAddress)
continue;
Reg.Set(Key2 + ServiceName,"IPAddress", LanIp);
Reg.Set(Key2 + ServiceName,"SubNetMask", _T("255.255.255.0"));
Reg.Set(Key2 + ServiceName,"IPAutoconfigurationEnabled", 0);
Reg.Set(Key2 + ServiceName,"EnableDHCP", 0);
IPwasChanged = TRUE;
}
}
}
|
|
|
|
|
skydiver135 wrote: I need to let admin-user to change local area connection properties with in the program.
Why can't they just use the Windows Admin Tools?
led mike
|
|
|
|
|
At my previous employer I was often working on network related code and was changing my IP address every 5 minutes for 8 hours. As you can imagine this grew tiring so I spent a weekend writing an application to change my network settings in a single mouse click to one of several options.
Here is a function I pulled from that application:
BOOL CNetworkToolBox::GetNetworkCardsFromIpHlpAPI(CStringArray *szCards)
{
BYTE *pBuf=NULL;
DWORD dwSize=0;
DWORD dwResult=0;
BOOL bConnected=FALSE;
PMIB_IFTABLE pMIBTable;
CString str;
GetIfTable(NULL,&dwSize,FALSE);
pBuf=new BYTE[dwSize];
pMIBTable=reinterpret_cast <PMIB_IFTABLE>(pBuf);
if(NO_ERROR == GetIfTable(pMIBTable,&dwSize,FALSE))
{
for(UINT i=0; i < pMIBTable->dwNumEntries; ++i)
{
if(MIB_IF_TYPE_LOOPBACK != pMIBTable->table[i].dwType)
{
if(MIB_IF_OPER_STATUS_CONNECTED == pMIBTable->table[i].dwOperStatus
|| MIB_IF_OPER_STATUS_OPERATIONAL == pMIBTable->table[i].dwOperStatus)
{
str.Format("%d@%s",pMIBTable->table[i].dwIndex,pMIBTable->table[i].bDescr);
szCards->Add(str);
}
}
}
}
delete []pBuf;
return bConnected;
}
You can check the dwType member of the MIB_IFROW Structure[^] and look for the value IF_TYPE_IEEE80211 which designates the interface as wireless. All other cards would be physical/virtual. I am using the IP Helper Library so you will need to include the following:
#include "Iphlpapi.h"
#pragma comment(lib, "iphlpapi.lib")
Btw, there are better ways to set the interface options than raw registry.
Best Wishes,
-David Delaune
|
|
|
|
|
It's possible that WMI[^] might be a better, more reliable approach.
This article[^] shows why WMI is better than searching through the registry for system information.
|
|
|
|
|
I have a question about CSocket and thread.
I have an application server C++/MFC (Visual Studio) that need to have 300 connection always open.
My server receive data from industrial machines and save data into a remote database.
On internet i have seen that many programmers use a thread for every connection that is open.
My application don't create directly a thread for every connection.
I only create a new CSocket object when i receieve a new connection request (i have a csocket that listen for this request).
So i have a list of 300 CSocket object.
I see that operating system / MFC library call OnReceive when machines send data to my server.
Inside the OnReceive() i write machine data in a dedicated file (there is a file for every industrial machine) .Another thread (this is the only working thread that i have created, reads sequentially all these files, do some computations and then sometimes write info into an SQL database.
So, my appliaction has a User Interface thread (created by the Visual studio framwork), a working thread that execute a loop to read all machine files to see if there is new data.
Then there are all these CSocket object that in an asyncronous way execute OnReceive to save data from machine into its file.
I am not sure that this is a good archietecture because with 300 connections my application has become slow.
May be that if i create a separate thread for every connection performance improves ?
When i create a csocket object indirectly i create a thread ?
Which is the difference ?
Thank you for your attention.
Emanuele.
|
|
|
|
|
|
My networking era ended without me actually trying out I/O completion ports.. That's there for years in my to-do list.
OK,. what country just started work for the day ? The ASP.NET forum is flooded with retarded questions. -Christian Graus
Best wishes to Rexx[^]
|
|
|
|
|
Once you get the hang of using them, they work extremely well.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thank you for your reply.
Emanuele.
|
|
|
|
|
popacio wrote: I am not sure that this is a good archietecture because with 300 connections my application has become slow.
May be that if i create a separate thread for every connection performance improves ?
I would not recommend creating 300 threads. Your probably not going to gain anything by doing this, context switching will be very high along with increased memory usage. Your bottleneck is using 300 instances of the high level CSocket Class[^]. You would have a tremendous performance gain by using Overlapped I/O and an event based model using i/o completion ports[^]. This would also increase your scalability, in the future your employer may ask you to increase the data logging capability to double the network nodes.
Here is a fairly good read over at MSDN regarding I/O Completion Ports.[^]
Len Holgate has released a free version of his IOCP based, socket server framework[^] if your interested.
There is also the Boost.Asio library by Christopher Kohlhoff[^]. I have used both libraries, they seem to have similar performance although I did not comparatively benchmark them.
Best Wishes,
-David Delaune
|
|
|
|
|
Thank you for yout reply.
Emanuele R.
|
|
|
|
|
Hi,
This app is written in C++ without MFC.
My question is this:
Let's say my app is not full screen, and a user clicks the top bar of the app and drags it around the screen. Is there a windows message that gets sent back to my main app's message pump to tell me when the window is moving? like WM_<somethingorother> etc? I have been looking over MSDN and other documentation and I have not been able to find anything like this but maybe I am missing something.
If it does not send a message, is there any other way that I can tell when the app is being dragged around?
Thanks!
KR
|
|
|
|
|
Are you looking for WM_MOVING[^]?
Best Wishes,
-David Delaune
|
|
|
|
|
That is what I needed, thank you!!!
KR
|
|
|
|
|
My boss asked me to try to fix V studio on one of our computers and I cant find anything on the web thats very helpful. Anytime you try to add a file to a project to errors pop up. The first is the Studio has encountered a problem wih the details.
"AppName: msdev.exe AppVer: 6.0.8168.1 ModName: devshl.dll ModVer: 6.0.8168.0 Offset: 0003eaed"
These second is an application error:
Instruction at "0x73dd11c7" referenced memory at "0x00000004", the memory could not be "read".
Just wondering if anyone else has experienced this problem and new a quick fix, im probably goin to reinstall Visual Studio and see if that works.
|
|
|
|
|
Do you have any 3ed party visual studio addins installed? If yes, try uninstalling them at first.
Regards,
Jijo.
_____________________________________________________
http://weseetips.com[ ^] Visual C++ tips and tricks. Updated daily.
|
|
|
|
|
|
|
old, but i like vc++ 6.0 since i can transport it on my usb.
I had the same problem and this worked for me. Download visual studio SP6 found here.
http://www.microsoft.com/downloads/details.aspx?FamilyID=A8494EDB-2E89-4676-A16A-5C5477CB9713&displaylang=en[^]
If you have trouble installing it, and it gives you some error about running a 16 bit program, it is because your system is not creating short file names. You can just extract to the C:\ drive to a folder with a really short, no space name, or for a more permanent fix, look here
http://www.cloanto.com/kb/14-131[^]
which pretty much says
If the following value is set to 1 then short file names are not created:
* HKEY_LOCAL_MACHINE\System\
CurrentControlSet\Control\FileSystem\
NtfsDisable8dot3NameCreation=1
If the value is missing, or set to 0, then short file names are created:
* HKEY_LOCAL_MACHINE\System\
CurrentControlSet\Control\FileSystem\
NtfsDisable8dot3NameCreation=0
Also, i had set it to compatibility mode at first which didnt work, and after I updated, this was causing it to still crash. So turn off compatibility mode.
|
|
|
|
|
In a tree control with expanded nodes, Leaf and "Has Lines" structure, I would like to put a bigger icon/bitmap there, but seems like no space there for more than a very small simple icon after the dots...Am I missing something to be able to create more space for a bigger icon, or is it just the way it is?
Thanks
sft
|
|
|
|
|
For CTreeViewCtrlEx, TVM_SETITEMHEIGHT, see <a href="http://msdn.microsoft.com/en-us/library/bb760104(VS.85).aspx">http://msdn.microsoft.com/en-us/library/bb760104(VS.85).aspx</a> 'sets the height of the tree view items'. Possibly this leaves more space?
|
|
|
|
|
Hi,
I have a double value describing rotation angle for a text box object. I need to convert it to quaternion. I have searched the web, and all I get is converters that conver Euler angle to Quaternion.
I would appreciate any formulae or algorithm.
And this double value is the only information I have for rotation.
Regards,
Shoaib
Its never over !
|
|
|
|
|
shaibee wrote: I have a double value describing rotation angle for a text box object. I need to convert it to quaternion.
As far as I know, a quaternion is used in 3D. So how can you convert a double which represents an angle into a 3D rotation ? You need to at least have a rotation around an axis...
|
|
|
|
|
Yes you are right, its to be used in 3D. I am not good in this domain. The docs for that double value say "angle in radians rotated from +ve world x-axis". Does this indicate something ?
update: Now I understand that I need a vector, along with the angle for the conversion, but that vector is no where to seen in the information object for the text box. Is ther anything I can use as default for +ve world x-axis as it says above.
Its never over !
|
|
|
|