|
Mike,
Thank you for your reply. Where do you add it? I added it to configuration properties\linker\general\additional library directories. I though am now getting LINK2019 for each of the functions. See below:
Exercise.obj : error LNK2019: unresolved external symbol "double __cdecl Max(double const *,int)" (?Max@@YANPBNH@Z) referenced in function _main
1>Exercise.obj : error LNK2019: unresolved external symbol "double __cdecl Min(double const *,int)" (?Min@@YANPBNH@Z) referenced in function _main
1>Exercise.obj : error LNK2019: unresolved external symbol "double __cdecl Average(double const *,int)" (?Average@@YANPBNH@Z) referenced in function _main
1>Exercise.obj : error LNK2019: unresolved external symbol "double __cdecl Sum(double const *,int)" (?Sum@@YANPBNH@Z) referenced in function _main
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
|
|
|
|
|
hello,
in your project properties, linker/input, add your .lib file name.
for eg.
yourlibfile.lib
this will solve your issue.
Regards,
A. Gopinath.
|
|
|
|
|
tagopi,
This is the solution that was posted by WayneAKing in the Visual C++ Developer Center forum. His posting is in response to an error listing that I posted. This guy knows everything. My program is now working.
I added the directory to the project configuration
>properties - linker - general tab.
That's half the requirements.
What did I say to add, and where did I say to add it?
Look under Linker->Input for "Additional Dependencies"
and add your .lib filename to the list.
>int main()
You are making a console program.
>error LNK2019: unresolved external symbol _WinMain@16
>referenced in function ___tmainCRTStartup
WinMain is used with Win32 GUI applications, not console apps.
How did you create the project? Which project template did
you use? You should have selected "Win32 Console Application".
Look under Linker->System for "SubSystem" and set it to
"Console (/SUBSYSTEM:CONSOLE)"
- Wayne
|
|
|
|
|
So here is something really crazy. I have a class, which looks something like this:
protected:
HWND hWindow;
HWND hChildren[100];
private:
public:
Everything works fine. But if i change hChildren[100] to hChildren[1000] - so now i can add up to 1000 children, class starts acting mental. Consider the following:
void function1(){}
void function2(){}
I am calling function1() ,
myClass *cl = new myClass();
cl->function1();
instead of that, the function, which gets called - is function2() . This happens if i change size of hChildren from 100 to 1000. If size is 100, the one which executes - is function1() (which is OK). Have you ever experienced code behavior like this? Its like, some undesirable polymorphism occurred
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
The first thing I do for "crazy, can't happen" stuff is rebuild the whole solution. Oh, and you might try deleting the .ncb file too.
|
|
|
|
|
Although Hans is mosssst likely right (this sort of things happens when you copy some files around and the timestamps of the object in the project are anymore coherent, so you rebuild only partially something that should be rebuilt all)consider if your design needs a review.
An array of 1000 HWND is 4 or KBytes long, and fits all into the object storage that may be used in the stack as a local variable. The space on the stack is not "as wide as the computer is", so think to dynamic allocation for this kind of bulks (for example: std::vector<hwnd> don't have this problem).
Also: a window with 1000 active children is kick in the ass for the operating system: do you really need all of them? Can't you create only the ones that are really visible?
2 bugs found.
> recompile ...
65534 bugs found.
|
|
|
|
|
Emilio Garavaglia wrote: An array of 1000 HWND is 4 or KBytes long, and fits all into the object storage that may be used in the stack as a local variable.
Isn't the stack set to 1 Mb by default?
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]
|
|
|
|
|
It is a parameter defined at link time. The stack is allocated when a thread is created, based on the parameter the shell find in the exe, just before starting the process.
It is 1MB for MS compilers, but other may be different.
But the point is how many of those object can exist on the stack in case of a recursive call: 1MB is not a soooo big space.
If you know that will never happen, OK.
2 bugs found.
> recompile ...
65534 bugs found.
|
|
|
|
|
Container of size 1000 never gets really filled, nor does even that one of size 100, so its not that bad, trust me
Basically, i would never go with an app which has 1000 child controls present at a time - it was rather like "testing here, testing there, changing some value here and there, see what can happen", but as well it was a quick check if i can theoretically have an array of 1000 controls. So, thank you for an advice on vector, i haven't considered this, but now will try
Thanks
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
1000 HWNDs on your system? Any idea of the overhead that would place on the Operating System? No wonder things go crazy. I would suggest that even 100 on the average PC is far too many.
I must get a clever new signature for 2011.
|
|
|
|
|
Thanks for you replies. So, rebuilding did not help, deleting ncb file did not help either. Maybe i should use these #pragma pack's ? Anyway, probably i just stick with array of 100 child windows, or will use vector . Well, actually vector is a good idea. These 1000 HWNDs are child windows - controls, so it is not a big deal, they are not like, separated windows (in such case that would be a real overkill), besides, that is just a container so it can hold up to some amount of controls doesnt mean there are that many controls
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
I certainly would not want to use an application that had that many controls on it. As to your problem, are you sure there is not some bug elsewhere in the code?
I must get a clever new signature for 2011.
|
|
|
|
|
Nope, there is no error anywhere. As for the amount of controls - it is not even an application, it is a class - i am trying to write a class, which will be able to store unlimited amount of controls, child windows handles to, lets say, invalidate them on resize or something. At this point i am using vector as a container and it works nicely. Richard, sometimes an application needs to have a lot of controls because there is no possibility to do it other way. Consider 3D Studio Max - there is no way to pack all its functionality into 10 controls. My biggest app (for some company) has about 300 of controls at a time - and i have shrank it from about 500 of controls, so you see how it is.
011011010110000101100011011010000110100101101110
0110010101110011
|
|
|
|
|
LRESULT CALLBACK devDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DEVICECHANGE:
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME)lParam;
switch(wParam)
{
case DBT_DEVICEARRIVAL:
MessageBox(NULL,_T("FOUND"), _T(""),MB_OK);
break;
case DBT_DEVICEREMOVECOMPLETE:
MessageBox(NULL,_T("REMOVED"), _T(""),MB_OK);
break;
}
break;
}
return FALSE;
}
While Inserting memory card reader DBT_DEVICEARRIVAL notifies about Four Removable Drives (O,P,Q,R Drives),
But while removing memory card reader DBT_DEVICEREMOVECOMPLETE notifies about only ONE Removable Drive (O Drive).
Why DBT_DEVICEREMOVECOMPLETE does not notifies about other Three removable drives ( P,Q,R Drives). Help
Some Day I Will Prove MySelf :: GOLD
modified on Monday, March 7, 2011 5:43 AM
|
|
|
|
|
All bit mask fields of removed units in pVol->dbcv_unitmask may come in one turn.
You had also better check (pVol->dbcv_devicetype == DBT_DEVTYP_VOLUME) like below.
...
case WM_DEVICECHANGE:
{
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME)lParam;
switch(wParam)
{
case DBT_DEVICEARRIVAL:
{
if(pVol->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
pVol->dbcv_unitmask;
MessageBox(NULL,_T("FOUND"), _T(""),MB_OK);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
{
if(pVol->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
pVol->dbcv_unitmask;
MessageBox(NULL,_T("REMOVED"), _T(""),MB_OK);
}
}
break;
}
break;
...
|
|
|
|
|
this code is not notifying neither DEVICE_ARRIVAL nor DEVICE REMOVAL.
Some Day I Will Prove MySelf :: GOLD
|
|
|
|
|
Does your device generate something other than DBT_DEVTYP_VOLUME as dbcv_devicetype member of the structure? Because this is the only difference from your code snippet above. You can inspect it by setting a break point on that line if you would like to.
|
|
|
|
|
Ozer Karaagac wrote: Does your device generate something other than DBT_DEVTYP_VOLUME as dbcv_devicetype member of the structure
dbcv_devicetype = 2
When i insert the memory card reader DBT_DEVICEARRIVAL detect four drives (O,P,Q,R)
but when memory card is removed DBT_DEVICEREMOVECOMPLTE detect only one drive removed from system (O drive), why other three drives is not notified.
(P,Q,R Drives)
Some Day I Will Prove MySelf :: GOLD
|
|
|
|
|
DBT_DEVTYP_VOLUME as defined 2 already.
Could you also inspect dbcv_unitmask in case DBT_DEVICEREMOVECOMPLETE, it should be occurred only once (according to you)?
|
|
|
|
|
Ozer Karaagac wrote: dbcv_unitmask in case DBT_DEVICEREMOVECOMPLETE
is 245760.
and this is occurred only once.
Some Day I Will Prove MySelf :: GOLD
|
|
|
|
|
Well, 245760 = 0x3c000 in hex = 111100000000000000 in binary.
111100000000000000
RQPONMLKJIHGFEDCBA
Which means that you got notifications for all 4 volumes.
You should test its bit flags.
DWORD dwTestMask = 1;
char archVols[32];
int nCount = 0;
for(int i = 0; i < 26; i++)
{
if(pVol->dbcv_unitmask & dwTestMask)
archVols[nCount++] = 'A' + i;
dwTestMask <<= 1;
}
You will receive array of volume letters in archVols.
This notifications may or may not be occurred one per volume.
|
|
|
|
|
thanx, it worked
Some Day I Will Prove MySelf :: GOLD
|
|
|
|
|
Hi
I have a conceptual question that relates with socket programming.
I know that socket number = IP number + Port number and
A TCP packet contains four numbers, source IP source port, destination IP destination port.
How am I gonna picture port number and applications while socket programming.
Is it problem to have two or more applications use same port? or must every application has distinct port number?
Is it problem to have two or more clients making communication over same port? or must every client has distinct port number?
|
|
|
|
|
Your question is an excellent question. Most books and articles that talk about sockets FAIL to explain this and question goes to the heart of all real world examples of writing socket code.
I will answer your question with a real world example that I worked on recently.
Let's say that you want to show stock data about a stock or group of stocks that changes every second in a web page and that the source of this data is some TCP server that you would connect to and receive a callback from every second in the form of strings. So let's say the user select a stock symbol like "IBM" and wants to see the price and volume traded of IBM stock in their web browser every second. Another user might want to see the value of a different stock symbol like "ACL" for Alcon, Inc.
How many IP addresses and Ports we would need? As you know we must use web Sockets to connect from a web page to a TCP Server--BUT there is another problem--none of the stock alert data servers have implemented the Web Sockets protocol handshake so we will need a web socket proxy between the web page and the Data Server. There are 2 samples of web Sockets Servers posted here on CodeProject that we can use.
If we put the ip address and port INSIDE the web page and connect to a Web Sockets Server then that web sockets server must spin off a thread that will in side each thread open a TCP connection to Data Server on a given ip address and port. The data from the thread received from the data server will be sent to the web socket server and then back to the client web browser that requested the data and NOT to any other browsers. Each browser on connecting to the web socket server passes in a "settings string" like say the stock symbol so that 2,000 different web browsers would see different data for 2,000 different stock symbols where each browser would have a datagrid displaying say hundreds of rows of stock data per second for that one symbol they requested.
When you set up this scenario--trial and error are good ways to learn socket programming--you will quickly realize that the amount of data that the web sockets data has to return is huge and the Data Server is passing the data for all 2,000 connected web browsers back to one place, namely the web sockets server--you could write a queue manager but that can't handle this kind of volume.
Here is the solution and answer to you question. You create a web service to return different port numbers to the web page. The web page sits on the server along with your web sockets server so the web page will first send a request to the web service and the web service will launch a NEW INSTANCE of the web sockets server with the SAME IP Addresses BUT a new port number and the web service will send that port number corresponding to the instance of the web sockets server it launched to the web page page that will then make a web socket connection via TCP to the new instance of the web sockets server. In this way you will have a new instance of Web Sockets server which is just a console app running for EACH web browser that is connected where each web browser has a different port number specified. You can easily connect 2,000 web browsers this way.
In summary, the ip addresses can be the same but the port numbers must change.
http://www.KabbalahCode.com
|
|
|
|
|
Your knowledge is correct from a simplistic point of view.
Perhaps you should get some first hand experience with Wireshark[^].
Sniff a session, such as a opening the google homepage.
For a TCP session to work the following must happen:
1. The server starts up and listens (binds) on a port.
No other programs can be listening for data on this port (although they can send from it which is a different session)
This port is almost always pre-determined (like 80 for HTTP) but if you specify 0 the OS will give a random port which the client must be sent by some other means (like an email) before connecting
2. The client connects to the IP of the server and the port from part 1.
If you looked at Wireshark, this does the SYN, SYN/ACK and ACK that starts the session
3. Send/receive from both server and client.
4. Shutdown the socket when done with it from both ends, both server and client must shutdown both send and receive directions when finished.
If you looked at Wireshark, this does the FIN/ACK and ACK once from each end.
5. Close the socket. This frees the system handle on the socket
|
|
|
|
|