|
Is it possible to receive an event in an MFC program running on the client when a file on a web server is modified?
I want to do this without .net or any special software, only HTML, PHP and javascript. I plan to host the web on a shared host and the code should work out-of-the-box on any web host which supports php programming.
If this is not possible, would it be possible for javascript (I don't know javascript) to inform the MFC program running on the client when it modifies the file (socket communication?)?.
I know how to poll a php page from MFC, but polling a web page every second to evaluate if a file has changed is certainly not the way to go.
Since I'm totally new to all this, code snippets would be very much appreciated.
Thank you
|
|
|
|
|
A tcp socket connection is ideal because the connection is always there. But in real life it's rarely feasible in most internet situations because of networking administration issues (can't have open ports, firewall configurations, etc.).
However, HTTP on standard port 80 works for pretty much anyone with internet access. But HTTP is request/reply so polling is generally used. Take a look at this document to see a description of how MS implemented the Polling Duplex HTTP support for Silverlight. Silverlight 2 WCF Polling Duplex Support – Part 1: Architecture[^] Maybe some ideas there...
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
If I understand you and the linked article correctly, there is no real life possibility to use sockets. Setting up port-forwarding in modems is definitely out of question.
My only option seems, therefore, to be to use CHttpFile and send defined requests to a php web page every second (I need almost real-time performance) and read the web contents returned.
If this is the only way to do reliable duplex communications, so be it. To me it seems a terrible waste of bandwidth and I would have thaught that better methods existed.
Unless someone tells me that I have completely misunderstood the answer given, I will go ahead and experiment with CHttpFile and co.
|
|
|
|
|
The bandwidth issue isn't that bad. The implementation described at the link uses the reply timeout before sending another request, so if no data is available for the client, polling requests are only sent once every 60 seconds by default. And the requests are very small. Viewing a webpage can cause hundreds of requests in a very short period of time (like a second), so one little request a minute is nothing.
I personally would use (and have used) WinHTTP[^], but CHttpFile may be fine for your needs.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I am Using the VC++ coding,I don't know how to sort the list of files in a folder.Can anybody know please give me the solution with syntax also....
Thanks,
manojkumar.U
|
|
|
|
|
What do you mean exactly by "sort the list of files in a folder" ? There is no such thing as that. You can view them sorted in the explorer but they still are not "sorted" on your hard disk.
What are you trying to achieve ? Do you want to modify the sort order for a specific folder within the explorer ? Do you want to retrieve a sorted list of files to use within your application ?
Which kind of sorting do you need ?
Well, you really need to describe your problem in more details...
|
|
|
|
|
This control[^] should help you get what you want.
The best things in life are not things.
|
|
|
|
|
i want code for ,two string arrays,if one element in the string array is compared to the another all elements in th enext array,if it is findout discard the element go to the next element.
|
|
|
|
|
Sorry, but I don't understand what you are asking for here. If you need to sort a list of strings then either use one of the STL[^] types that provides for sorting, or use the CRT quick sort[^] function. If you are trying to reduce an array to unique entries, then once again one of the STL templates should work for you.
The best things in life are not things.
|
|
|
|
|
|
When I know the exe path of a file:
hExeModule = LoadLibrary(exe);
...blah..blah..
FindResource(hExeModule, "#N", RT_ICON);
While there are so many icons in the exe file, how can I pass the N parameter as the icon index used for application's representitive main icon which appear on explorer ?
Thanks!!
|
|
|
|
|
If you know the value of N then you should send it as described here[^]. However if you do not know the names then you will need to use the EnumResourceNamesEx()[^] function to get them.
The best things in life are not things.
|
|
|
|
|
First result on Google that I code, CodeProject article[]
Might be interesting to read. I suspect that the first Icon in the file is the one used for the application, but I am not sure.
|
|
|
|
|
Hi all.
I have a link list in a vector structure. It throws exception while freeing first node of the list. This is the sample code-
typedef struct _TEST_STRUCT
{
TCHAR _tchTemp[MAX_PATH];
__int64 i64Temp;
DWORD dwTemp;
_TEST_STRUCT *Next;
}TEST_STRUCT;
typedef struct _TEST_VECTORST
{
int nVal;
TEST_STRUCT m_ListInVector;
}TEST_VECTORST;
std::vector<TEST_VECTORST> m_StVector;
CString csVal = L"";
csVal = L"hello";
for (int i = 0; i < 2; i++)
{
memset (&wVectorSt, 0x00, sizeof(TEST_VECTORST));
ptrList = NULL;
wVectorSt.nVal = i + 1;
int j = 0;
while (j<10)
{
if (ptrList == NULL)
{
ptrTemp = (TEST_STRUCT*)calloc(1,sizeof(TEST_STRUCT));
_tcscpy(ptrTemp->_tchTemp, csVal);
ptrTemp->dwTemp = 10+j;
ptrTemp->i64Temp = 100+j;
ptrTemp->Next = NULL;
ptrCurrent = ptrList = ptrTemp;
}
else
{
ptrTemp = (TEST_STRUCT*)calloc(1,sizeof(TEST_STRUCT));
_tcscpy(ptrTemp->_tchTemp, csVal);
ptrTemp->dwTemp = 10+j;
ptrTemp->i64Temp = 100+j;
ptrTemp->Next = NULL;
ptrCurrent->Next = ptrTemp;
ptrCurrent = ptrTemp;
}
j ++;
}
memcpy(&wVectorSt.m_ListInVector, ptrList, sizeof(TEST_STRUCT));
m_StVector.push_back (wVectorSt);
}
for (int i = 0; i<m_StVector.size(); i++)
{
ptrList = m_StVector[i].m_ListInVector.Next;
while (ptrList != NULL)
{
ptrTemp = ptrList;
ptrList = ptrList->Next;
free(ptrTemp);
ptrTemp = NULL;
}
}
All the nodes become free but one that is very first node in the list does not free.
if i take start to free from first node like- ptrList = &m_StVector[i].m_ListInVector;
then it throws exception immidiately and does not free any node...
Please give me some idea...
Thanks
modified on Tuesday, June 21, 2011 4:17 AM
|
|
|
|
|
Please use the 'code block' button to format properly your code.
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]
|
|
|
|
|
You did not dynamically allocate the first member, so you cannot dynamically free it either.
More to the point: when you push_back() a struct object into that vector of yours, the vector will allocate the required memory and copy the struct you passed into that memory location. The vector is thus responsible for the releaese of that storage, not you. Since you didn't allocate the vector on the heap, it will be automatically deallocated when the variable leaves the scope. But if you defined it globally, then you might want to enforce this earlier, by calling
m_StVector.clear() .
|
|
|
|
|
thanks for the response.
Yes i have declared m_StVector in App class. So i need to clear it.
but even i do m_StVector.clear() then still i see those memory leaks that are due to the first node of the link list...
well I am still stuck how to free those.
|
|
|
|
|
I just noticed that of course you need to free the strings within your struct, and that is something your vector will not take care of.
The best way would be to define both a constructor and destructor for your struct, and use new/delete instead of calloc/free. In the destructor you can then just take care of the string:
struct TestStruct {
TestStruct() : tchTemp(0) {}
~TestStruct() { delete [] tchTemp; }
void set(const TCHAR* stringvalue) {
delete [] tchTemp;
if (stringvalue != 0) {
tchTemp = new TCHAR[_tcslen(stringvalue)+1];
_tcscpy(stringvalue, tchTemp);
}
else {
tchTemp = 0;
}
}
TCHAR* tchTemp;
};
void test() {
std::vector<TestStruct> struct_vect;
struct_vect.clear();
}
Note that in order to actually deconstruct (i. e. call the constructor of) the TestStruct objects, you must call delete , not free , on any dynamically allocated objects, and thus you must call new to allocate it. Also you must use new to allocate your strings if you want to use delete to free them. I added a set function to simplify the process of assigning this string properly, using new .
Of course, if you don't want to change your struct definition, you can also loop over the element vectory and free() tchTemp from your first nodes manually.
|
|
|
|
|
Why are you using your own list, cannot you use the STL one?
Why are you using C allocation functions?
What is wVectorSt ?
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]
|
|
|
|
|
Madan Chauhan wrote: All the nodes become free but one that is very first node in the list does not free.
How are you verifying this?
Madan Chauhan wrote: Please give me some idea...
Just a tad bit of cleanup:
void main( void )
{
for (int i = 0; i < 2; i++)
{
TEST_STRUCT *ptrCurrent;
TEST_VECTORST wVectorSt = {0};
wVectorSt.nVal = i + 1;
for (int j = 0; j < 10; j++)
{
TEST_STRUCT *ptrTemp = (TEST_STRUCT *) calloc(1, sizeof(TEST_STRUCT));
_tcscpy_s(ptrTemp->_tchTemp, _countof(ptrTemp->_tchTemp), _T(""));
ptrTemp->dwTemp = 10 + j;
ptrTemp->i64Temp = 100 + j;
ptrTemp->Next = NULL;
if (wVectorSt.m_ListInVector == NULL)
wVectorSt.m_ListInVector = ptrTemp;
else
ptrCurrent->Next = ptrTemp;
ptrCurrent = ptrTemp;
}
m_StVector.push_back(wVectorSt);
}
for (unsigned int i = 0; i < m_StVector.size(); i++)
{
TEST_STRUCT *ptrList = m_StVector[i].m_ListInVector;
while (ptrList != NULL)
{
TEST_STRUCT *ptrTemp = ptrList;
ptrList = ptrList->Next;
free(ptrTemp);
}
}
}
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|
I have the List o f names(if list type of list is CString),How to sort the list of names.Anybody knows please send me the syntax of the coding.
Thanks&Regards,
Lucky.
|
|
|
|
|
What kind of container holds the CString s?
If you are using MFC containers, then have a look at Newcomer's "A guide to sorting"[^].
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]
|
|
|
|
|
List classes (std::list or MFC CList etc) are temlate classes and can't have a sort function in a general basis. You have to iterate through the elements in list and implement any of the sorting algorithms as you do with noraml arrays. Since you are dealing with CString, you can use the overloaded < and > operators for comaparing string objects in list.
|
|
|
|
|
Hi all,
I want to convert a char array into CString.
i have tried various ways like
char array[620];
CString str(array,620);
It is giving a compiler error.
Can anybody help me with this?
thanks in advance
|
|
|
|
|
I don't think you need to specify the length in the CString constructor, so you would have
CString str(array);
|
|
|
|