|
Hi All:
I wanna implemented a application with MFC, when clicke a button on any application, select a icon on the desktop then play sound.
I try to implement similar function with ON_WM_LBUTTONDOWN(), but not satisfied my request. If I click everywhere on desktop, it will play sound too.
How do I implement this application? Does any keyword or reference?
My English is not good. Please forgive me.
Best regards, Victor
|
|
|
|
|
|
But, I added WM_LBUTTONDOWN into Mousehookproc, it does not work.
which do I add in, WinProcHook or Mousehookproc? if I add into WinProcHook, how can I get the button?
Thanks for your help, Victor
|
|
|
|
|
You'll have to use the concept of 'hook'.
Please refer to hook details here. You can use this[^] article for your reference.
|
|
|
|
|
But, I added WM_LBUTTONDOWN into Mousehookproc, it does not work.
which do I add in, WinProcHook or Mousehookproc? if I add into WinProcHook, how can I get the button?
Thanks for your help, Victor
|
|
|
|
|
Please verify that the Hook got installed properly. Once the hook is installed, you should be able to get the messages.
When the mouse event is received, you can check the window handle. Using that window handle, identify the class type of the window.
|
|
|
|
|
Greetings to all friends.
I want to develop an application that decrypt an exe file format and save it in RAM and then run it . Developed application does not allow the save decryption output to a file. To run an exe application that is loaded to RAM I have no idea. Please guide me.
Thanks to all friends
|
|
|
|
|
As far as I am aware, there is no Windows function that allows you to do this. The LoadLibrary function[^] can load a module from file storage into memory, so that you can execute it directly, but there is no facility for loading direct from RAM.
Veni, vidi, abiit domum
|
|
|
|
|
Windows, like most modern operating systems, uses virtual memory to execute a program.
In this scheme, only data that needs to be modified is loaded into RAM.
Read-only data and code are directly mapped from disk and not loaded into RAM.
The best that you can do is create a RAM disk and save the output to a file on the RAM disk.
To a program, this RAM disk would be very similar to an ordinary disk drive.
Here is a list of of available RAM drive software - List of RAM drive software[^]
«_Superman_»
I love work. It gives me something to do between weekends.
Microsoft MVP (Visual C++) (October 2009 - September 2013) Polymorphism in C
|
|
|
|
|
|
Hi All,
I'm in begining of implementing a software but i need to make sure the software should be OS (operating system) independent. So which design pattern i need to implement.
Langauge used - C++
Thanks,
Manisha
|
|
|
|
|
Making software independent of OS has nothing to do with design patterns. You need to make sure that the actual code you write can be correctly built on every OS that you plan to support. That is, you must ensure you do not use any features specific to a particular version.
Veni, vidi, abiit domum
|
|
|
|
|
|
To add to what Richard said, C++ is a good choice for writing native cross platform code.
Similarity to write cross platform user interface code, you would need to use certain GUI libraries like in this list - List of platform-independent GUI libraries[^]
«_Superman_»
I love work. It gives me something to do between weekends.
Microsoft MVP (Visual C++) (October 2009 - September 2013) Polymorphism in C
|
|
|
|
|
Or.... just completely separate your GUI from your working code.
|
|
|
|
|
The Bridge[^] pattern is often use when code needs to be OS independent.
The pattern will help you split the abstract portable code with the actual non-portatble implementation.
For example, if you need to create a OS independent graphic toolkit, you will have a set of portable classes that will be use by the application developers on every OS; and a set of classes that will be dependent on the particular OS (for example GDI on windows , X11/XLib, cocoa (?) on Mac... ) framework.
I'd rather be phishing!
|
|
|
|
|
I'm working on win ce 6 modbus tcp client server, application is developed for a client server communication and it is working fine. now req is my slave device should respond to the diff slave addresses polled by master/client. Can I just change slave id and establish connection or I need to close previous connection and again establish new one
below is the code, which is working fine for one node, if I polled with other node ID then it gives exception. what change it req to communicate with other node simultaneously. My device should be able to communicate with 32 diff nodes on modbus tcp. Shall I create individual threads for each node but how they will communicate on same port? before establishing connection with other node shall I close previous node?
startupServer(int slaveAddr, const TCHAR * const hostName)
{
int result;
int tcpOption;
struct sockaddr_in hostAddress;
if (isStarted())
return (FTALK_ILLEGAL_STATE_ERROR);
if ((slaveAddr < -1) || (slaveAddr > 255))
return (FTALK_ILLEGAL_ARGUMENT_ERROR);
this->slaveAddr = slaveAddr;
#ifdef _WINSOCKAPI_
WSADATA wsaData;
result = WSAStartup(0x0101, &wsaData);
if (result != 0)
return (FTALK_SOCKET_LIB_ERROR);
#endif
listenSocket = socket(PF_INET, SOCK_STREAM, 0);
if (listenSocket == INVALID_SOCKET)
{
shutdownServer();
return (FTALK_OPEN_ERR);
}
#ifdef SO_REUSEADDR
tcpOption = 1; setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR,
(char *) &tcpOption, sizeof (tcpOption));
#endif
hostAddress.sin_family = AF_INET;
if ((hostName == NULL) || (hostName[0] == '\0'))
hostAddress.sin_addr.s_addr = htonl(INADDR_ANY);
else
{
hostAddress.sin_addr.s_addr = inet_addr((char *) hostName);
#if !defined(__VXWORKS__) // We don't support host name resolving with VxWorks
if (hostAddress.sin_addr.s_addr == INADDR_NONE)
{
struct hostent *hostInfo;
hostInfo = gethostbyname((char *) hostName);
if (hostInfo == NULL)
return (FTALK_TCPIP_CONNECT_ERR);
hostAddress.sin_addr = *(struct in_addr *) hostInfo->h_addr;
}
#endif
}
hostAddress.sin_port = htons(portNo);
result = bind(listenSocket, (struct sockaddr *) &hostAddress,
sizeof (hostAddress));
if (result == SOCKET_ERROR)
{
shutdownServer();
switch (socketErrno)
{
#ifdef _WINSOCKAPI_
case WSAEACCES:
return (FTALK_PORT_NO_ACCESS);
case WSAEADDRINUSE:
return (FTALK_PORT_ALREADY_BOUND);
case WSAEADDRNOTAVAIL:
default:
return (FTALK_PORT_NOT_AVAIL);
#else
case ENOTCONN: case EACCES:
return (FTALK_PORT_NO_ACCESS);
case EADDRINUSE:
return (FTALK_PORT_ALREADY_BOUND);
case EADDRNOTAVAIL:
default:
return (FTALK_PORT_NOT_AVAIL);
#endif
}
}
result = listen(listenSocket,
((MAX_CONNECTIONS < SOMAXCONN) ? MAX_CONNECTIONS : SOMAXCONN));
if (result == SOCKET_ERROR)
{
shutdownServer();
return (FTALK_LISTEN_FAILED);
}
return (FTALK_SUCCESS);
}
serverLoop()
{
int iReturnCode = (FTALK_SUCCESS);
int result;
int sockIdx;
int recvResult;
int sendResult;
fd_set fdSet;
timeval timeVal;
SOCKET maxFileDes;
int replyCnt;
int tcpOption;
if (!isStarted())
return (FTALK_ILLEGAL_STATE_ERROR);
FD_ZERO (&fdSet);
#ifdef _MSC_VER
# pragma warning(push)
# pragma warning(disable: 4127)
#endif
FD_SET (listenSocket, &fdSet);
#ifdef _MSC_VER
# pragma warning(pop)
#endif
maxFileDes = listenSocket;
for (sockIdx = 0; sockIdx < MAX_CONNECTIONS; sockIdx++)
{
if (connectionSocketArr[sockIdx] != INVALID_SOCKET)
#ifdef _MSC_VER
# pragma warning(push)
# pragma warning(disable: 4127)
#endif
FD_SET (connectionSocketArr[sockIdx], &fdSet);
#ifdef _MSC_VER
# pragma warning(pop)
#endif
if (connectionSocketArr[sockIdx] > maxFileDes)
maxFileDes = connectionSocketArr[sockIdx];
}
timeVal.tv_sec = (long) timeOut / 1000L;
timeVal.tv_usec = ((long) timeOut % 1000L) * 1000L;
if (timeOut == 0)
result = select((int) maxFileDes + 1, &fdSet, NULL, NULL, NULL);
else
result = select((int) maxFileDes + 1, &fdSet, NULL, NULL, &timeVal);
if (result == SOCKET_ERROR)
return (FTALK_FILEDES_EXCEEDED);
if (result == 0)
{
TRACELOG1("Slave poll time-out!\n");
dataTablePtr->timeOutHandler();
iReturnCode = (FTALK_REPLY_TIMEOUT_ERROR);
}
if (FD_ISSET (listenSocket, &fdSet))
{
for (sockIdx = 0; sockIdx < MAX_CONNECTIONS; sockIdx++)
{
if (connectionSocketArr[sockIdx] == INVALID_SOCKET)
{
struct sockaddr_in peerAddr;
SOCK_LEN_TYPE peerAddrLen = sizeof(peerAddr);
connectionSocketArr[sockIdx] = accept(listenSocket,
(struct sockaddr *) &peerAddr,
&peerAddrLen);
if (connectionSocketArr[sockIdx] != INVALID_SOCKET)
{
if (!dataTablePtr->validateMasterIpAddr(inet_ntoa(peerAddr.sin_addr)))
{
shutdown(connectionSocketArr[sockIdx], SD_BOTH);
closesocket(connectionSocketArr[sockIdx]);
connectionSocketArr[sockIdx] = INVALID_SOCKET;
TRACELOG2("Connection rejected on slot %d\n", sockIdx);
}
#ifdef TCP_NODELAY
tcpOption = 1; setsockopt(connectionSocketArr[sockIdx],
IPPROTO_TCP, TCP_NODELAY,
(char *) &tcpOption, sizeof (tcpOption));
#endif
#ifdef SO_SNDBUF
tcpOption = MAX_MSG_SIZE;
setsockopt(connectionSocketArr[sockIdx],
SOL_SOCKET, SO_SNDBUF,
(char *) &tcpOption, sizeof (tcpOption));
#endif
#ifdef SO_RCVBUF
tcpOption = MAX_MSG_SIZE;
setsockopt(connectionSocketArr[sockIdx],
SOL_SOCKET, SO_RCVBUF,
(char *) &tcpOption, sizeof (tcpOption));
#endif
#ifdef SO_LINGER
tcpOption = 0; setsockopt(connectionSocketArr[sockIdx],
SOL_SOCKET, SO_LINGER,
(char *) &tcpOption, sizeof (tcpOption));
#endif
TRACELOG2("Connection accepted on slot %d\n", sockIdx);
}
break; }
}
}
for (sockIdx = 0; sockIdx < MAX_CONNECTIONS; sockIdx++)
{
if (connectionSocketArr[sockIdx] != INVALID_SOCKET)
{
if (FD_ISSET (connectionSocketArr[sockIdx], &fdSet))
{
recvResult = recv (connectionSocketArr[sockIdx],
(char *) bufferArr, sizeof (bufferArr), 0);
sendResult = 0;
replyCnt = 0;
if (recvResult >= PREFIX_LEN) {
short dataLen;
dataLen = (short) ((bufferArr[4] << 8) | (bufferArr[5] & 0xFF));
if ((dataLen + PREFIX_LEN) == recvResult)
{
replyCnt = processMessage(&bufferArr[PREFIX_LEN],
recvResult - PREFIX_LEN);
bufferArr[2] = 0; bufferArr[3] = 0; bufferArr[4] = (char) ((replyCnt) >> 8);
bufferArr[5] = (char) ((replyCnt) & 0xFF);
sendResult = send(connectionSocketArr[sockIdx],
(char *) bufferArr,
replyCnt + PREFIX_LEN, 0);
}
}
if ((recvResult < PREFIX_LEN) ||
(sendResult != replyCnt + PREFIX_LEN))
{
shutdown(connectionSocketArr[sockIdx], SD_BOTH);
closesocket(connectionSocketArr[sockIdx]);
connectionSocketArr[sockIdx] = INVALID_SOCKET;
if (recvResult == 0)
TRACELOG2("Disconnected slot %d nicely by other peer.\n",
sockIdx);
else
TRACELOG2("Forced disconnection on slot %d!\n", sockIdx);
}
}
}
}
return iReturnCode;
}
|
|
|
|
|
First you need to tell us what exception you received and also exactly where in the code it occurred.
Veni, vidi, abiit domum
|
|
|
|
|
Not exactly exception but it's not communicating to other node id. If I test it using modscan utility, it works for device id "1" for which communication is established for first time but if trying to communicate with device id "2" then communication is not established.
|
|
|
|
|
I'm afraid that does not help much. You need to use your debugger to find out where the code is failing.
Veni, vidi, abiit domum
|
|
|
|
|
I don't have h/w debug on it. I'm using visual studio 2008, is there any way to debug this issue with visual studio and modscan utility. can I comment all error handling things and just accept client and recv data? will it work?
int ModbusTCPSlave::serverLoop()
{
int iReturnCode = (FTALK_SUCCESS);
int result;
int sockIdx;
int recvResult;
int sendResult;
fd_set fdSet;
timeval timeVal;
SOCKET maxFileDes;
int replyCnt;
int tcpOption;
timeVal.tv_sec = (long) timeOut / 1000L;
timeVal.tv_usec = ((long) timeOut % 1000L) * 1000L;
if (timeOut == 0)
result = select((int) maxFileDes + 1, &fdSet, NULL, NULL, NULL);
else
result = select((int) maxFileDes + 1, &fdSet, NULL, NULL, &timeVal);
{
{
{
struct sockaddr_in peerAddr;
SOCK_LEN_TYPE peerAddrLen = sizeof(peerAddr);
connectionSocketArr[sockIdx] = accept(listenSocket,
(struct sockaddr *) &peerAddr,
&peerAddrLen);
recvResult = recv (connectionSocketArr[sockIdx],
(char *) bufferArr, sizeof (bufferArr), 0);
sendResult = 0;
replyCnt = 0;
if (recvResult >= PREFIX_LEN) {
short dataLen;
dataLen = (short) ((bufferArr[4] << 8) | (bufferArr[5] & 0xFF));
if ((dataLen + PREFIX_LEN) == recvResult)
{
replyCnt = processMessage(&bufferArr[PREFIX_LEN],
recvResult - PREFIX_LEN);
bufferArr[2] = 0; bufferArr[3] = 0; bufferArr[4] = (char) ((replyCnt) >> 8);
bufferArr[5] = (char) ((replyCnt) & 0xFF);
sendResult = send(connectionSocketArr[sockIdx],
(char *) bufferArr,
replyCnt + PREFIX_LEN, 0);
}
}
if ((recvResult < PREFIX_LEN) ||
(sendResult != replyCnt + PREFIX_LEN))
{
shutdown(connectionSocketArr[sockIdx], SD_BOTH);
closesocket(connectionSocketArr[sockIdx]);
connectionSocketArr[sockIdx] = INVALID_SOCKET;
if (recvResult == 0)
TRACELOG2("Disconnected slot %d nicely by other peer.\n",
sockIdx);
else
TRACELOG2("Forced disconnection on slot %d!\n", sockIdx);
}
return iReturnCode;
}
|
|
|
|
|
Visual Studio contains a program debugger as standard. If you have not used it before then now is the time to learn.
Veni, vidi, abiit domum
|
|
|
|
|
will the above code with commented error handling will resolve the issue...so that i can communicate with multiple device ids like 1, 2, 3..32
|
|
|
|
|
Member 10296418 wrote: will the above code with commented error handling will resolve the issue Sorry, but I cannot answer that question. You need to try the code in your debugger to see exactly what is happening. In general you should be able to accept any number of connections, and manage the communication between server and clients quite easily.
Veni, vidi, abiit domum
|
|
|
|
|
Using modscan if I poll for same IP with diff device ID application should responds to every device id, In above code I commented checking INVALID_SOCKET..and recv message is called so that messages will be received with diff device IDs. will it work?
|
|
|
|
|