|
Try NetSessionEnum(NULL, ...) .
"Opinions are neither right nor wrong. I cannot change your opinion of me. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
hello,
I have two .exe, the main application (in mfc) and a directshow filter crossed by a video stream.
From the directshow filter code, when a certain value is detected I have to send it (to the main application) and to make start a method in the main application.
How can I realise such a thing ? Is Callback a possible solution ?
Thanks a lot for your help and have a nice day,
alain
There is no way to happiness, happiness is the way !
|
|
|
|
|
I don't believe callback is possible. Here are some high level suggestions you can research.
You can try the function FindWindow(..) to get a handle on your MFC window and then SendMessage() to send a message to this window. It's a win32 function.
Otherwise you may need to use some other method (interprocess communication). I suppose you can try network communication using sockets. Maybe send/receive on 127.0.0.1. Or I believe Windows should provide some functions to send/receive messages between processes.
There are tutorials on codeproject.
http://www.codeproject.com/threads/[^]
|
|
|
|
|
Thanks a lot for your answer.
I am triing to use the BEGIN_MESSAGE_MAP of MFC to realise what I need :
BEGIN_MESSAGE_MAP(CPatchingMPEG2Dlg, CDialog)
ON_MESSAGE(WM_USER+1, OnMyMessage)
END_MESSAGE_MAP()
I think it's the right direction, but now I get the difficult of paasing m_hwnd variable to my direcshow code. I am going to try your solution with 'FindWindow' which seems very good !
I wish you a nice day,
thanks, alain
There is no way to happiness, happiness is the way !
|
|
|
|
|
|
Hello,
I'm led to believe that one can use GetModuleHandle and GetProcAddress to get a function from another exe...
The thing you can do is export a function from your main application (the callback) and use GetProcAddress from the direct show filter code to call the callback...
Hope this helps
Multiply it by infinity and take it beyond eternity and you'll still have no idea about what I'm talking about.
|
|
|
|
|
Hello, thanks a lot for your answer.
I am triing to use the BEGIN_MESSAGE_MAP of MFC to realise what I need :
BEGIN_MESSAGE_MAP(CPatchingMPEG2Dlg, CDialog)
ON_MESSAGE(WM_USER+1, OnMyMessage)
END_MESSAGE_MAP()
I think it's the right direction, but now I get the difficult of passing m_hwnd variable to my direcshow code. I am going to try the solution with 'FindWindow' as suggested by Budric.
If I cannot go on with this I will try your solution.
I wish you a nice day and again thanks very much for your help !
alain
There is no way to happiness, happiness is the way !
|
|
|
|
|
Hi Friends,
I've a treectrl on a dialog based application which gets populated from
ms-access database containing some 2000 records in OnInItDialog. To fetch the
data, i am simply using the SQLFetch and inserting it using a while loop in treectrl using InsertItem, but it takes too much of time. Can anybody help me in speeding up my treectrl.
The fields in my database are "BookmarkName", "BookmarkType" where Bookmark
name is the bookmark name and BookmarkType is either "Folder" or "Bookmark" and Bookmarks are added as child in Folders.
Vikram Kashyap
"You will never fail, until u stop trying"
|
|
|
|
|
you should probably post a snippet of what your routine to insert the items into your tree control looks like. That'll make it easier for us to see where you might have any problems
Who are all these people and what are they doing in my house?...Me in 30 years, inside a grocery store
My articles[^]
bdiamond
|
|
|
|
|
Hi,
the code snippet...
void CInsertBookmark::LoadTreeItems()
{
BeginWaitCursor();
m_pTree.SetRedraw(FALSE); //Works fine in case of lesser records
CString BookMarkType, BookMarkPath, BookMarkName;
BookMarkType.Empty();
BookMarkPath.Empty();
BookMarkName.Empty();
CString TempPath;
TempPath.Empty();
HSTMT hstmt;
SDWORD len = SQL_NTS;
RETCODE rc;
char m_BookMark_Node_Path[256];
char m_BookMark_Node_Name[256];
char m_BookMark_Type[256];
int nIndex = 0;
strTemp.Format("SELECT BookMark_Node_Path, "
"BookMark_Node_Name, "
"BookMark_Type "
"FROM BookMark "
"ORDER BY BookMark_Node_Path");
SQLAllocStmt(m_pdb->m_hdbc , &hstmt);
SQLBindCol(hstmt,1, SQL_C_CHAR, &m_BookMark_Node_Path , sizeof(m_BookMark_Node_Path), &len);
SQLBindCol(hstmt,2, SQL_C_CHAR, &m_BookMark_Node_Name , sizeof(m_BookMark_Node_Name), &len);
SQLBindCol(hstmt,3, SQL_C_CHAR, &m_BookMark_Type , sizeof(m_BookMark_Type) , &len);
if (SQLExecDirect(hstmt, (UCHAR*)(LPCTSTR)strTemp, SQL_NTS) == SQL_ERROR)
{
DisplayErrorMsg(&hstmt);
SQLFreeStmt (hstmt, SQL_DROP);
return ;
}
while(TRUE)
{
rc = SQLFetch(hstmt);
if(rc == SQL_ERROR)
{
DisplayErrorMsg(&hstmt);
SQLFreeStmt (hstmt, SQL_DROP);
return ;
}
else if(rc == SQL_NO_DATA_FOUND)
break;
BookMarkPath.Empty();
BookMarkPath.Format("%s",m_BookMark_Node_Path);
BookMarkType.Empty();
BookMarkType.Format("%s",m_BookMark_Type);
BookMarkName.Empty();
BookMarkName.Format("%s",m_BookMark_Node_Name);
if(BookMarkType.CompareNoCase("Folder") == 0)
{
m_pTree.Initialize(true);
HTREEITEM hItem = m_pTree.GetNext();
while (hItem != NULL)
{
m_pTree.SelectItem(hItem);
TempPath = GetPathFromItem(hItem) ;
if(TempPath.Compare(BookMarkPath) == 0)
{
//Inserting items into tree ctrl
m_pTree.InsertItem(_T(BookMarkName), ILI_CLSDFLD, ILI_OPENFLD, hItem, TVI_SORT);
BookMarkPath.Empty();
BookMarkType.Empty();
break;
}
else
hItem= m_pTree.GetNext();
}
}
if(BookMarkType.CompareNoCase("BookMark") == 0)
{
m_pTree.Initialize(true);
HTREEITEM hItem= m_pTree.GetNext();
while (hItem != NULL)
{
m_pTree.SelectItem(hItem);
TempPath = GetPathFromItem(hItem);
if( TempPath.Compare(BookMarkPath) == 0)
{
//Inserting items into tree ctrl
m_pTree.InsertItem(_T(BookMarkName), ILI_BOOKMARK, ILI_BOOKMARK, hItem, TVI_SORT);
BookMarkPath.Empty();
BookMarkType.Empty();
break;
}
else
hItem= m_pTree.GetNext();
}
}
}
SQLFreeStmt (hstmt, SQL_DROP);
m_pTree.SetRedraw(TRUE);
EndWaitCursor();
}
|
|
|
|
|
Well, the database fetching data could be slow. Another could be the tree control.
To get the tree to fill faster you can turn off the visual update of the control during the fill. Lookup SetRedraw or WM_SETREDRAW on MSDN or your help.
--
Joel Lucsy
|
|
|
|
|
hi,
i've been looking around on the internet for some flight navigation instrument on C++ (for free ) but i always ended up on GMS and their 400$ activex.
So i was wondering if any of ya knew where i could find some?
Thx in advance
the noob in C++
|
|
|
|
|
Dear All
I have a CListCtrl with a CImageList containing bitmaps. These bitmaps are displayed in LargeIcon View in the List Control.
I want that the user should be able to use the keys like left, right, up, down, pgup,pgdown, home, end etc. to move through the images contained in the List Control.
for e.g. if I am on the last item in the row, the right arrow key should take me to the first item of the next row...
How do I provide this kind of funtionality....
any help would be greatly appretiated...
Thanks in Advance...
Manoj Singh
|
|
|
|
|
I found a file in my archives named cstring.h dated 9/25/2002. This looks like a good replacement for the MFC CString with the same name. I just want to know who I should give credit to if I decide to use it. Does any one know who might have written it? There is one comment at the top of the file that reads: // CString class : exposes the equivalent of the MFC API, without the MFC
Ray
|
|
|
|
|
That isn't a lot to go on. Perhaps a link to the code would be better, if at all possible.
Ant.
I'm hard, yet soft. I'm coloured, yet clear. I'm fruity and sweet. I'm jelly, what am I? Muse on it further, I shall return! - David Williams (Little Britain)
|
|
|
|
|
Since you only mention a header file, are all methods inline or is all of the implementation within the header file? This would seem extreme for a String class. You may need to search in your archives for more files before you actually get to use it. Without seeing the code, could it possibly be a copy of the MFC header file for the CString class?
Chris Meech
I am Canadian. [heard in a local bar]
..a scientist venturing into the fields of philosophy and metaphysics is like Tie Domi figure skating. It's not a pretty sight. [Toronto Star Article]
|
|
|
|
|
The implementation of class is within the definition and non are inline. It uses malloc and free and I am finding out that the Format function does not work if there was no data in the string before use. Whoever wrote this probably has already fixed it. Following is part of the class.
class CString
{
// Members
protected:
char *m_str;
// Constructor/Destructor
public:
CString()
{
m_str = NULL;
}
CString(char *szInputSource)
{
m_str = NULL;
if (szInputSource)
Copy(szInputSource);
}
CString(const CString &szInputSource)
{
m_str = NULL;
Copy(szInputSource.GetData());
}
~CString()
{
Empty();
}
// Methods
public:
void Empty()
{
if (m_str)
{
free( m_str );
m_str = NULL;
}
}
void Format(LPSTR pszFormat, ...) // do not use, m_str does not have the right buffer allocated
{ // missing here is a preliminary loop that sums the amount of bytes required to expand pszFormat according to argList %s, %d, ...
va_list argList;
va_start(argList, pszFormat);
vsprintf(m_str, pszFormat, argList );
va_end(argList);
}
Ray
|
|
|
|
|
Do a search for CString replacement here on codeproject I know I downloaded one awhile back from here.. I have to head off to work other wise I would do some searching for you.. I'm sure you will find it.
Rob
Whoever said nothing's impossible never tried slamming a revolving door!
|
|
|
|
|
Hi
I just started C++, but this code I found on the net blew me away. Could someone please help me understand, especially the lines market with a /**/.
void read_data_from_bs(void *data, int bits_of_data,
unsigned char *bit_stream, unsigned long & bit_offset)
{
int i;
int n;
while (bits_of_data > 0)
{ // <-- Colored with red by Instant Match
n = bits_of_data > 8 ? 8 : bits_of_data; /**/
*(unsigned char *)data = 0;
for (i = 0; i < n; i++)
{
if (read_bit(bit_stream, bit_offset))
{
(*(unsigned char *)data) |= (1 << i); /**/
}
bit_offset++ ;
}
data = ((unsigned char *)data) + 1; /**/
bits_of_data -= n;
}
}
|
|
|
|
|
Brakanjan wrote:
n = bits_of_data > 8 ? 8 : bits_of_data; /**/
First, we test if the value of bits_of_data is greater than 8 (bits_of_data > 8 ?). If yes, we store 8 into n, if no, we store the value of bits_of_data into n. These is another syntax for this:
if (bits_of_data>8)<br />
n = 8;<br />
else<br />
n = bits_of_data;
Brakanjan wrote:
(*(unsigned char *)data) |= (1 << i); /**/
A little bit trickier to understand... (unsigned char*)data means we cast the void pointer data into a pointer to unsigned char. >(*(unsigned char*)data) means we acces to the value that is pointed by data. (1 << i) is a bit shifting (so we put the i bit at 1 and the other are left to 0). So, with the | operator means that you leave all the bits inside your pointer the same but put the bit i to 1... Hum, hope this is clear enough because it's not easy to explain
Brakanjan wrote:
data = ((unsigned char *)data) + 1; /**/
Means that you increment the data pointer -> so you go to the next value pointed by data.
|
|
|
|
|
Ok, there are a few things that may be confusing to a new C programmer
The ? notation can be incredibly baffling if you've never seen it before - it's basically a kind of condensed if-else statement
e.g.
if( n == 0 )
{
x = 42;
}
else
{
x = 0;
}
could be written as
x = (n==0) ? 42 : 0; (but it's pretty awful to have to read later, so this syntax tends not to get used very much in practice!)
<< and >> are "shift" operators - they perform a binary shift on a number:
1 << 8 would be the binary number 100000000 (or the decimal number 256)
A line like ((unsigned char*)data) is called a Cast - it's basically telling the compiler to treat the variable data as if it was of type unsigned char*
Any good C programming book should have more details on these
--
Help me! I'm turning into a grapefruit!
Phoenix Paint - back from DPaint's ashes!
|
|
|
|
|
benjymous wrote:
it's basically telling the compiler to treat the variable data as if it was of type unsigned char*
where would that be used?
Any place where I can read more about it?
Tx for the help guys
|
|
|
|
|
The line:
{ // <-- Colored with red by Instant Match
Makes me suspect that this was autogenerated by some other program. I have no idea what that could be. (though it might be one of your comments and I misunderstood it) In general machine generated source code is difficult to understand.
The things confusing you are rarely used C abilities. Look them up in a book, you may need them latter, but don't worry about understanding exactly what they are doing until you are more advanced. You can program for a long time without needing any of these tricky parts.
I'm assuming that you are just reading this code. If you picked it because there is a reason you want to change it, then go slow. This is some tricky stuff.
n = bits_of_data > 8 ? 8 : bits_of_data;
You are setting n to something. Others have explained exactly what just fine. The important thing to remember when you see the "? :" operator is that n is important, not the if statement to decide what to set it too. Many programers live their entire life without using "? :", but experts know that used correctly it can make your code more readable. if else should be used far more often.
|
|
|
|
|
I came across the code while searching for a nice hex viewer/editor, so I have no idea who/what wrote it.
One more thing: I see the variables accepted by the procedure is unsigned char *bit_stream and unsigned long & bit_offset, which if I remember correctly * refers to the the address and & to the value, or how should that be interpreted? how do you know which to use?
tx for the help
|
|
|
|
|
No in fact the * is the indirection operator. It is used to access the value pointed by a pointer. So, when you declare a pointer (int* pTest for example), it must be read like that: "the value pointed by pTest is an integer". So, it means that pTest is a pointer.
The & represent the adress of something (can be a value, a char, or even a pointer...). So, when you write
int Value = 0; , &Value represent the adress of your integer...
So applying this in your case in the function, when you write unsigned char* bit_stream means that you are passing not the value but the pointer to an unsigned char.
For your second argument, this is a little bit different: when you use the & for one of your parameter of your function, that means that this parameter is passed by reference and not by value. In other word that means implicitely that the adress of your variable is passed to the function and so, if you modify the content of it, it will be visible outside of your func (the function doesn't make a copy of the value but work directly on it).
In general you use the pointer (*) when you need to pass an array, and you use the (&) when you need to get a value from your function (but without returning it with return...).
Hope this is a little bit clearer
|
|
|
|
|