|
Alex, you are right. I made a mistake in original post. I do need to know Target. I edit orignal post.
Thanks
|
|
|
|
|
Derive your own class CMyTree : CTree
CMyTree::OnCreate
{
//REGISTER THIS WINDOW AS AN OLE DROP TARGET.
m_DropTarget.Register(this);
}
where m_DropTarget
class CDropTarget : public COleDropTarget // make him friend in CMyTree
{
public:
virtual DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual BOOL OnDrop( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point );
};
DROPEFFECT CDropTarget::OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
return ((CMyTree*)pWnd)->OnDragEnter(pDataObject, dwKeyState, point);
}
DROPEFFECT CDropTarget::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
return ((CMyTree*)pWnd)->OnDragOver(pDataObject, dwKeyState, point);
}
BOOL CDropTarget::OnDrop( CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point )
{
return ((CMyTree*)pWnd)->OnDrop(pDataObject, dropEffect, point);
}
and finaly
DROPEFFECT CMyTree::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
if (pDataObject->IsDataAvailable(...))
{
UINT nFlags;
HTREEITEM hDropTarget = HitTest(point, &nFlags);
if(nFlags & TVHT_ONITEM)
{
SelectDropTarget(hDropTarget);
m_pTree->SelectDropTarget(hDropTarget);
// my custom message to my code process can I drop here or not
if(1 == GetOwner()->SendMessage(MYTW_CAN_DROP_HERE, 0, (LPARAM)hDropTarget))
return DROPEFFECT_MOVE;
else
return DROPEFFECT_NONE;
}
}
return DROPEFFECT_NONE;
}
Sorry if it lot. But this thing is not really obvious.
|
|
|
|
|
|
Hello!
My problem on C ++ is such:
In the program-text converter I use many times function Replace:
... <br />
if(m_bVocView) m_sReadFromFile.Replace(" # "," \r\n "); <br />
if(m_bVocView) m_sReadFromFile.Replace("\\\\ ","\r\n\r\n ");<br />
if(m_bVocView) m_sReadFromFile.Replace("\\ ","\r\n ");<br />
if(m_bVocView) m_sReadFromFile.Replace("\r\n~~~",""); <br />
....
As a result the program should read a file from the beginning up to the end many times. How to make all replacements on one fly?.. How to merge all this conditions into one single continuous and pretty program pass, for example:
if (m_bVocView) <br />
{<br />
if ("\\\\ ")<br />
{<br />
m_sReadFromFile.Replace("\\\\ ","\r\n\r\n ");<br />
if ("\\ ")<br />
{<br />
m_sReadFromFile.Replace("\\ ","\r\n ");<br />
}<br />
...
How to determine, that the string for replacements can be one, another, the third and based on these variants to proceed the demand to the program to make that or another replacement by one pass?.. How to joint all variants (which are not superimposed against each other) in one line-up?..
And the second part of this problem. To make replacements in a file I sequentially activate functions:
CreateFile
ReadFile
WriteFile
How to join all this functions onto one like as COPY or openURL? Is it possible to make replacements during function openURL for text file?..
|
|
|
|
|
fallologia wrote:
As a result the program should read a file from the beginning up to the end many times.
Why? Just read the file once into a CString variable, and then make the calls to Replace() .
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
Hi!
I've developed a client program in VS 2005 beta. in C++ / MFC. This works perfectly on the computer I develop on. However when I tried to run it on another computer ( that don't have VS 2005 installed ) I get:
"The requested section was not present in the activation context" error when launching the application. It is compiled in release mode.
Any ideas how to find what's wrong? I guess it's some dependency, but how do I find out what's missing?
|
|
|
|
|
the machine you're trying to run on don't have the right libraries... if you did program in MFC, you'll have to provide a file called something like mfc8xx.dll
doesn't the error code tell your more ?
moreover, what sort of resources do you reach by your code (servers or so) ?
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
toxcct wrote:
the machine you're trying to run on don't have the right libraries... if you did program in MFC, you'll have to provide a file called something like mfc8xx.dll
That's what I thought...
I tried to copy the redistributable MFC-dlls. ( mfc80u.dll / mfc80.dll / mfcm80u.dll / mfcm80.dll ) and msvcrt.dll.
It did not help at all. The same error.
toxcct wrote:
doesn't the error code tell your more ?
I only get a dialog with this error message. No code or anything
toxcct wrote:
moreover, what sort of resources do you reach by your code (servers or so) ?
I communicate with a web server using CHttpConnection-class and the like. So should not be anything special?
I don't use any database or anythin like that either.
Thanks for the help! Got any more ideas?
|
|
|
|
|
To be certain change the MFC settings to static link rather than chared DLL.
Elaine
The tigress is here
|
|
|
|
|
Trollslayer wrote:
To be certain change the MFC settings to static link rather than chared DLL.
Thanks! That solved the problem!
|
|
|
|
|
Henrik Pettersson wrote:
That solved the problem!
Which indicates that not all required libraries were present on the target machine.
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
There is a question very confusing to me
I studied from MSDN sample codes about CFtpFileFind Class
and I want to show all files(including directories) in one ftp site so I use such codes like
CFtpFileFind FF(...)
BOOL bCont=FF.FindFile(_T("*"));
if(bCont)
while(FF.GetNextFile())
{
//classify files or dirs and do different things;
//of course when meeting dirs do recursive proc;
}
But the result is that it can list all files and dirs in some ftp sites
but in other sites it will return some "." ".." dirs and lost some dirs.
I do not know why this happens,Please help
PS: When I wrote the ftp program,I called CInternetFile's GetLength Function but it can not return correct file length,also very strange,Can somebody Help,Thanks!!
|
|
|
|
|
I had problems with this as well when I was using this function. I figured out that apparently this function fails when there is a space in the name of file/directory. Check out for this.
Steve Mayfield: "Coding in VB is like riding a tricycle...once you figured out how to peddle, its really hard to fall off."
My Articles
|
|
|
|
|
First Thank you for help
Then If what you said is right,Does that mean using this method I can not deal with those files/dirs with a space in its name,No Alternative ways??
|
|
|
|
|
jdnx wrote:
but in other sites it will return some "." ".." dirs and lost some dirs.
Some OSs support the . and .. convention while others do not.
jdnx wrote:
...I called CInternetFile's GetLength Function but it can not return correct file length,also very strange...
Not all FTP software running on the server has implemented the "length" function.
"Ideas are a dime a dozen. People who put them into action are priceless." - Unknown
|
|
|
|
|
i have a error when i used function NetMessageBufferSend.These are "error LNK2001: unresolved external symbol _NetMessageBufferSend@20" and"fatal error LNK1120: 1 unresolved externals"
|
|
|
|
|
Hope you have not missed to link with Netapi32.lib
<bold>- Nilesh
<italics>"Reading made Don Quixote a gentleman. Believing what he read made him mad" -George Bernard Shaw
|
|
|
|
|
VC++2003: Question about "Pointers to member functions" ~~~ when the pointers are inside a struct data member of the class type.
I am using VC++ .NET 2003.
It is OK when the case as F1 in the sample code below. But it can not compile in the case as F2 in the thread in sample code below.
Any idea? Thanks!!
-----------------
class CMyLoopbackDlg : public CDialog
{
public:
afx_msg void OnBnClickedStart();
public:
void PutMsg(CString sTxt, bool bDbgOnly = false);
public:
CWinThread* m_pThTest;
void (CMyLoopbackDlg::*F1) (CString, bool);
struct InfoThTest
{
void (CMyLoopbackDlg::*F2) (CString, bool);
HANDLE hEvent_A;
HANDLE hEvent_B;
} m_InfoTest;
};
void CMyLoopbackDlg::OnBnClickedStart()
{
#define __CASE_STRUCT__ // The option switch here.
#ifndef __CASE_STRUCT__ // This case works well.
F1 = PutMsg;
(this->*F1) ("1: Using Ptr_to_member in Start().", false);
if(!m_pThTest) {
m_pThTest = AfxBeginThread(TestThreadProc, this);
}
#else
m_InfoTest.F2 = PutMsg;
(this->*m_InfoTest.F2) ("Struct: Using Ptr_to_member in Start().", false);
if(!m_pThTest) {
m_pThTest = AfxBeginThread(TestThreadProc, &m_InfoTest);
}
#endif // __CASE_STRUCT__
}
UINT TestThreadProc(LPVOID pParam)
{
#ifndef __CASE_STRUCT__
CMyLoopbackDlg& ref = *(CMyLoopbackDlg*)pParam;
ref.PutMsg("--> TestThreadProc ");
Sleep(5000);
ref.PutMsg("<-- TestThreadProc ");
#else
CMyLoopbackDlg::InfoThTest* pp = (CMyLoopbackDlg::InfoThTest*)pParam;
(pp->*F2) ("Test", false);
(*(pp->F2)) ("Test", false);
#endif // __CASE_STRUCT__
return 0;
}
Maxwell Chen
|
|
|
|
|
Hello,
Using heavy preprocessor switching like that greatly decreases code readability. It makes it very difficult to understand!
Anyway, I found your problem.
Take a deeper look at your following code section:
UINT TestThreadProc(LPVOID pParam)
{
#ifndef __CASE_STRUCT__
CMyLoopbackDlg& ref = *(CMyLoopbackDlg*)pParam;
ref.PutMsg("--> TestThreadProc ");
Sleep(5000);
ref.PutMsg("<-- TestThreadProc ");
#else
CMyLoopbackDlg::InfoThTest* pp = (CMyLoopbackDlg::InfoThTest*)pParam; (pp->*F2) ("Test", false);
(*(pp->F2)) ("Test", false);
#endif // __CASE_STRUCT__
return 0;
}
What do we see here?
<list>CMyLoopbackDlg& ref = *(CMyLoopbackDlg*)pParam; Here you cast the parameter to an object of type CMyLoopBackDlg This is OK, since you passed the this pointer to the function.
CMyLoopbackDlg::InfoThTest* pp = (CMyLoopbackDlg::InfoThTest*)pParam; Here you cast the parameter to an object of type InfoThTest* . This is OK, since you passed a pointer to the member variable.
In the first case you call a member function and you pass the this pointer implicitly.
In the second case, your error is that you call a member function without the implicit this pointer. The compiler has no object that it can use to call the member function with! There are two solutions to this problem.
1: Make the member function static so it doesn't need the this pointer
2: Pass the this pointer as a member of the struct and cast that to the dialog type:
struct InfoThTest
{
void (CMyLoopbackDlg::*F2) (CString, bool);
CMyLoopBackDlg* pThis;
HANDLE hEvent_A;
HANDLE hEvent_B;
} m_InfoTest;
See the C++ Faq Why can't I use member functions as callbacks?[^] for more information.
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
Hello Bob, thanks for your reply!!
I live at Taipei (+8 timezone) and it is Saturday now. My PC at home does not have a VC++ at all. I will try your suggestions next Monday at office, and continue the discussion ...
Bob Stanneveld wrote:
Using heavy preprocessor switching like that greatly decreases code readability. It makes it very difficult to understand!
That preprocessor switch was just seen in this demo only, in order to put two different methods in one single function body ( OnBnClickedStart() ) to post question on the forum. Otherwise people who play around with this sample code would have to alter some //'s (or /* */) instead of only one single line at:
#define __CASE_STRUCT__ // The option switch here.
I don't use it in my actual code. Sorry about that!
I do not quite remember / am not sure enough about this way failed also:
UINT TestThreadProc(LPVOID pParam)
{
CMyLoopbackDlg* pThis = (CMyLoopbackDlg*)pParam;
(pThis->*F1) ("Hello 123...", false);
return 0;
} Anyway, I'll be back next Monday!
-----------------
class CMyLoopbackDlg : public CDialog
{
public:
afx_msg void OnBnClickedStart();
public:
void PutMsg(CString sTxt, bool bDbgOnly = false);
public:
CWinThread* m_pThTest;
void (CMyLoopbackDlg::*F1) (CString, bool);
struct InfoThTest
{
void (CMyLoopbackDlg::*F2) (CString, bool);
HANDLE hEvent_A;
HANDLE hEvent_B;
} m_InfoTest;
};
void CMyLoopbackDlg::OnBnClickedStart()
{
#define __CASE_STRUCT__ // The option switch here.
#ifndef __CASE_STRUCT__ // This case works well.
F1 = PutMsg;
(this->*F1) ("1: Using Ptr_to_member in Start().", false);
if(!m_pThTest) {
m_pThTest = AfxBeginThread(TestThreadProc, this);
}
#else
m_InfoTest.F2 = PutMsg;
(this->*m_InfoTest.F2) ("Struct: Using Ptr_to_member in Start().", false);
if(!m_pThTest) {
m_pThTest = AfxBeginThread(TestThreadProc, &m_InfoTest);
}
#endif // __CASE_STRUCT__
}
UINT TestThreadProc(LPVOID pParam)
{
#ifndef __CASE_STRUCT__
CMyLoopbackDlg& ref = *(CMyLoopbackDlg*)pParam;
ref.PutMsg("--> TestThreadProc ");
Sleep(5000);
ref.PutMsg("<-- TestThreadProc ");
#else
CMyLoopbackDlg::InfoThTest* pp = (CMyLoopbackDlg::InfoThTest*)pParam;
(pp->*F2) ("Test", false);
(*(pp->F2)) ("Test", false);
#endif // __CASE_STRUCT__
return 0;
}
Maxwell Chen
|
|
|
|
|
UINT TestThreadProc(LPVOID pParam)
{
CMyLoopbackDlg* pThis = (CMyLoopbackDlg*)pParam;
(pThis->*F1) ("Hello 123...", false);
return 0;
} This case (passing this pointer to callback) is not able to compile!!
------ Build started: Project: MyLoopback, Configuration: Release Win32 ------
Compiling...
ScrCtrl.cpp
MyLoopbackDlg.cpp
MyLoopbackDlg.cpp(304) : error C2065: 'F1' : undeclared identifier
MyLoopback.cpp
Generating Code...
Build log was saved at "file://d:\MyLoopback_Test_Ptr_to_MemFunc\Release\BuildLog.htm"
MyLoopback - 1 error(s), 0 warning(s)
---------------------- Done ----------------------
Build: 0 succeeded, 1 failed, 0 skipped
Maxwell Chen
|
|
|
|
|
Hello,
I think that it's illegal to call delegates from a non member function. Therefore you can assign values to F1 , but you canno't call the delegate. (Delegates are member function pointers.)
I created the following workaround:
The class
class CMyLoopbackDlg : public CDialog
{
public:
afx_msg void OnBnClickedStart();
void PutMsg(std::string sTxt, bool bDbgOnly = false);
typedef void (CMyLoopbackDlg::* Delegate)(CString, bool);
Delegate F1;
struct InfoThTest
{
CMyLoopbackDlg pThis;
Delegate F2;
HANDLE hEvent_A;
HANDLE hEvent_B;
}; m_InfoTest;
public:
void InvokeDelegate(Delegate pfn, CString sParam1, bool bParam2)
{
ASSERT( pfn );
Del = pfn;
(this->*Del)(sParam1, bParam2);
}
private:
Delegate Del;
};
The calling code:
unsigned TestThreadProc(void* pParam)
{
CMyLoopbackDlg* p = (CMyLoopbackDlg*)pParam;
p->InvokeDelegate(p->F1,
"Hellp 123...", false);
return 0;
}
You can use overloading of the InvokeDelegate function to call different member functions.
Hope this helps
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
Hello,
My original intention was to hide / to prevent from passing the whole CMyLoopbackDlg interface (either in poiter or in reference form) into the thread callback. I just hoped that the member structure could carry some functions of CMyLoopbackDlg to the thread callback as well as the handles to events, (... since that single object of CMyLoopback is there, and the data mamber m_InfoTest is public. And I don't want static member function stuffs...)
AfxBeginThread(TestThreadProc, &m_InfoTest); The solution (InvokeDelegate) still requires the exposure of CMyLoopbackDlg. This would be far from my intention.
Maxwell Chen
|
|
|
|
|
Hello,
There is a solution for your problem, but I think that it is a little bit cumbersome. (Actually there are many solutions to the problem, but all have their pro's and con's.)
One solution:
You create another worker thread, that has access to your dialog and everything else. That worker thread waits for one or multiple events. You other thread sets one of those events and your extra "observer" thread takes appropriate actions.
Other solution:
You demote the functionality that your thread needs to a special base class. You can also create a pure interface for this (only abstract methods). Pass a pointer or reference to this interface and your problem is solved.
Example:
class YourBasicInterface
{
public:
virtual void SetYourEvent1() = 0;
virtual void SetYourEvent2() { ::SetEvent(hYourEvent2); }
private:
HANDLE hYourEvent2;
};
class YourDialogClass : public CDialog, public YourBasicInterface
{
};
Hope this helps
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
Hello,
The solution 2 (class YourBasicInterface) is interesting. I will consider this. Thanks!!
Maxwell Chen
|
|
|
|
|