|
DLL is just a binary file containing executable code in PE(Portable Executable) format. One can make DLL's for many purposes like ActiveX objects, COM components, or simple library of functions.
-Saurabh
|
|
|
|
|
Hi saurabh,
Thanks for the response. can you explain what is the difference between the dll and activex dll. With respect to you answer may be I would put it this way, how does a dll differ when its purpose is to serve an ActiceX Object?
Regards,
LG.
lgatcodeproject
|
|
|
|
|
Conceptually there is no difference. They both are PE files. It is same as asking what is the difference between two BMP files.
-Saurabh
|
|
|
|
|
So, when you import any dll into an ActiveXControl you can call it as ActiceXDll, am I correct?
In VC++6.0 New->Project, one can find many projects, where in there is
"MFC AppWizard (dll)"and another project called
"ATL COM AppWizard"->Dll/Service(Exe)/Executable(exe);
can you tell me what is the difference between these two projectS? when would one choose these?
I had the lead to my initial question from the above option?
Regards,
LG.
lgatcodeproject
|
|
|
|
|
Okay let me explain by an analogy.
Let's say you have 100 BMP files. If you ask what type of files I have? Then asnwer is simple they all are BMP files and are no different to each other in that sense. But you can still categorize them based on their "content". You can have family photos, vacation photos, etc.
In the same way all DLL's are PE files. But based on what they "do" you can categorize them. If a DLL contain code for acting as an ActiveX control then you can loosely call it ActiveX DLL, just as you would call a family photo. If a code contains bunch of C funcitons you might call it utility DLL.
The APP wizard's function is to generate code based on the template you choose. So if you choose MFC ActiveX Control the App Wizard will generate the code which can be compiled into a DLL which will provide the functionality of a ActiveX controls and it will use MFC as well.
Hope this clears things up.
-Saurabh
|
|
|
|
|
Thanks saurabh, your anwer added more clarity. So when I say ActiveX Dll it means I need both the functionality of COM and Dll as well. Hope I am getting it all correctly!
Regards,
LG.
lgatcodeproject
|
|
|
|
|
Yes you have got it correctly.
-Saurabh
|
|
|
|
|
Thanks for explaining with patience. Have a nice day. Bye.
ReEgards,
LG
lgatcodeproject
|
|
|
|
|
You are most welcome. You too have a nice day.
-Saurabh
|
|
|
|
|
Hi,
I've got problem with MFC. I tried to run the query like this, and I am using recordset
select count(*) from dbo.Vehicle
and how to grab the value of the count(*)?
I found one way, but its running very slow by using loop
int inc = 0;
query = select * from dbo.vehicle
while(records is not eof or record is bof)
{
inc++;
records.movenext()
}
printf("Total count is %d",inc);
do you have any idea how to grab the value using the count(*) instead of running the loop
Thanks
Arif
|
|
|
|
|
Hi,
I'm coding a small fragment which gets called when the system fails to secure a resource on the local network. (it is to replace a Retrycancel Message, with a Dialog box on a different thread, telling that the system is busy, offering a 'Cancel button. The further idea is, that when the resource becomes available, the box disappears, and normal porocess follows. The entire Project is Dialog based.
The Escence of the code is as follows:-
<br />
int ProcDlg::Do(){<br />
if(!m_bIsRunning){ <br />
AfxBeginThread(ThreadProc,this);<br />
m_bIsRunning=TRUE;<br />
return IDOK;<br />
}<br />
else if(m_bDoCancel){<br />
return EndDialog(IDCANCEL);<br />
}<br />
<br />
else return IDOK;<br />
}<br />
<br />
void WaitDlg::OnCancel(){<br />
...<br />
m_pInfo->m_bDoCancel=TRUE;<br />
}<br />
<br />
UINT ThreadProc(void* pParam){<br />
WaitDlg dlg;<br />
dlg.m_pInfo=(ProcDlg*)pParam;<br />
dlg.DoModal();<br />
return 0;<br />
}<br />
The General Idea is, that the Wait Dialog sets a Flag in the Process Dialog, which, when stumbled upon, will do the cleanup.
To make the code readable, and to get to the nubb of the problem, I left out a lot of supporting code, including Synchronisation objects.
The thread that runs the Notification Dialog, gets locked up!
It locks the thread in:
<br />
if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))<br />
{<br />
::EnableWindow(hWndParent, FALSE);<br />
bEnableParent = TRUE;<br />
}<br />
in particular in ::EnableWindow.
Traceing into that in the Disassembly Window lands at an opcode 0x0F, where it stops.
What's going on here!
Bram van Kampen
|
|
|
|
|
Two things I see right away -
1) You're creating a worker thread when you need a UI thread.
2) How are you going to close the WaitDlg if it's in a modal loop?
What about using a modeless wait dialog created on the main UI thread?
The code that locks up - where is that, on what thread is it executing, and
what is hWndParent?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: 1) You're creating a worker thread when you need a UI thread.
The Thread starts off as a worker thread, but calls it's own WinProc as part of calling the second Dlg.DoModal(). Tried this by calling a UI thread, Same result.
Mark Salsbery wrote: 2) How are you going to close the WaitDlg if it's in a modal loop?
By Setting a Flag, and, by calling EndDialog(...) for the Dlg when the next itteration of the (Not Shown) Outer loop calls the appropriate routine.
Mark Salsbery wrote: The code that locks up - where is that, on what thread is it executing, and
what is hWndParent?
The locking Code is on the Second thread, trying to run WaitDlg.DoModal()
HISTORY
Opening Files on a network, fails if already open on other app.(Data Collision) The canonical access routine contains an endless loop which tries to open, sleeps for 100 msec, and tries again. (does so with multiple filesin a predetermined order) After 50 such tries on a single File, it gives a RetryCancel MsgBox. All obvious reasons for failure have at this stage been dealt with, we're dealing with the default.Experience shows that 'Retry' will solve it. I now want to replace the box with a Dialog: System is busy, with a cancel button, and which automatically returns 'IDRETRY' after say 500 msec.
Thanks,
Bram van Kampen
|
|
|
|
|
Are you giving the second-thread dialog a parent? That can cause problems in MFC
if the parent and child were created on different threads.
Regardless, what you're doing is so much simpler using a modeless dialog on the UI thread.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: Are you giving the second-thread dialog a parent? That can cause problems in MFC
if the parent and child were created on different threads.
Actually, No. Going to try that now. Q. In general, does the existence of a Parent CWnd Class suffice, or do we need to create the underlying window
(albeit Invisible)
Mark Salsbery wrote: Regardless, what you're doing is so much simpler using a modeless dialog on the UI thread.
Any chance of a brief outline of how to do that?
Thanks,
Bram.
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: does the existence of a Parent CWnd Class suffice, or do we need to create the underlying window (albeit Invisible)
You don't need a parent....I was only commenting that it would
cause problems if the parent was created on a different thread than the
child.
Bram van Kampen wrote: Any chance of a brief outline of how to do that?
From the main UI thread, create the CDialog object. Use Create()
instead of DoModal() to create the window (HWND).
Communication with the window can be done using window messages,
which can be posted from any thread.
That's definitely the safest way to use MFC windows.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks Mark,
The Time delay is because I'm dealing with many issues.
Mark Salsbery wrote: From the main UI thread, create the CDialog object. Use Create()
instead of DoModal() to create the window (HWND).
Communication with the window can be done using window messages,
which can be posted from any thread.
Well, I Bypassed experience in SDK programming. When I wrote programs in DOS, the perceived wisdom was that Windows would NEVER catch on. When I bought my compiler, MFC came free with it, and I eventually learned how to mould it to my needs by writing Dialog based Apps.
I understand how the WNDPROC is called from the Kernel, I also understand how the MessageMap is implemented;
How do I stitch the lot together.
Regards
Bram van Kampen
|
|
|
|
|
I'm completely lost, I have been given an assignment and hit a roadblock this is the assignment:
a.) Create a function called howMany that will search a two dimensional array for the the number of occurences a particular number is found within the array. Your function should return the number of occurences the number appears within the array and the cooridnates that each one is found.
Your function at the very least should take as arguments the number to search for, and the two dimensional array. You are going to need some mechanisim to return the coordinates. You could use a string, an array, or a 2D array here but I will leave that up to you. This means your function needs at least 3 arguments!
b.) Create another function that will take as arguments integer values that represent row, column coordinates. return the value at that location
c.) Write a function that will fill the array with random numbers from 1 - 10. Initially, your array should be 10 rows by 9 columns
Finally write some kind of driver to demostrate the functionality of your program. It would be nice if you used some kind of a loop and a simple menu scheme.
I also have no clue how to write a driver, my book has virtually no information on it and all the sites I have gone to in order to figure it out have offered a program that will act as one. If someone could post a program, I would appreciate the reference otherwise an explanation would be nice. Thank you.
|
|
|
|
|
Well driver is just a program. Its purpose is to show the capability of the code. You can think of it as front end to the logic of the program.
For example, lets say the main logic of the program is to compute sum of two numbers. Then you will do something like this.
void sum(int a, int b)
{
int c = a + b;
return c;
}
void main()
{
int a, b;
printf("Enter first number: %d", &a);
printf("Enter second number: %d", &b);
int c = sum(a, b);
printf("Sum of two numbers is: %d\n", c);
}
-Saurabh
|
|
|
|
|
livin lie wrote: I also have no clue how to write a driver...
A device driver?
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
A test driver, they are used to test each function and simplify the search for errors and warnings. Though I do not see the point in that part of my assignment, Debug informs the user of exactly where the problem can be located and the use of breakers is alot quicker.
|
|
|
|
|
Anyone point me to a good tutorial for Object Array List with Serialization?
Many thanks
AF Pilot
|
|
|
|
|
http://www.tenouk.com/visualcplusmfc/visualcplusmfc10b.html[^]
One of the easiest ways to use a CObList object is to add new elements to the tail, or bottom, of the list and to remove elements from the head, or top, of the list. The first element added to the list will always be the first element removed from the head of the list. Suppose you're working with element objects of class CAction, which is your own custom class derived from CObject. A command-line program that puts five elements into a list and then retrieves them in the same sequence is shown here:
#include <afx.h>
#include <afxcoll.h>
class CAction : public CObject
{
private:
int m_nTime;
public:
// Constructor stores integer time value
CAction(int nTime) { m_nTime = nTime; }
void PrintTime() { TRACE("time = %d\n", m_nTime); }
};
int main()
{
CAction* pAction;
// action list constructed on stack
CObList actionList;
int i;
// inserts action objects in sequence {0, 1, 2, 3, 4}
for (i = 0; i < 5; i++)
{
pAction = new CAction(i);
// no cast necessary for pAction
actionList.AddTail(pAction);
}
// retrieves and removes action objects
// in sequence {0, 1, 2, 3, 4}
while (!actionList.IsEmpty())
{
// cast required for return value
pAction = (CAction*) actionList.RemoveHead();
pAction->PrintTime();
delete pAction;
}
return 0;
}
Here's what's going on in the program. First a CObList object, actionList, is constructed. Then the CObList::AddTail member function inserts pointers to newly constructed CAction objects. No casting is necessary for pAction because AddTail() takes a CObject pointer parameter and pAction is a pointer to a derived class. Next the CAction object pointers are removed from the list of the objects deleted. A cast is necessary for the returned value of RemoveHead() because RemoveHead() returns a CObject pointer that is higher in the class hierarchy than CAction. When you remove an object pointer from a collection, the object is not automatically deleted. The delete statement is necessary for deleting the CAction objects.
There is sufficient light for those who desire to see, and there is sufficient darkness for those of a contrary disposition.
Blaise Pascal
|
|
|
|
|
Thanks very much for your assistance!
AF Pilot
|
|
|
|
|
Hi, I'm new to this forum. I'm taking C++ programming in school and it is very difficult for me. My homework is to create a c++ program that implements functions to display the following data. I dont know whats wrong or how to fix it please help.
I don't even know if I wrote the code properly. Any help is appreciated
#include <iostream>
#include <process.h>
#include "stdafx.h"
using namespace std;
/***************************************************************************/
// FUNTIONS
/***************************************************************************/
void Greeting();
void My_personal_info();
void My_favorite_movie();
void My_favorite_move();
void My_favorite_trip();
void My_favorite_book();
void My_favorite_sports();
void pause();
void clrscr();
//MAIN
int _tmain(int argc, _TCHAR* argv[])
{
// greeting the user
Greeting();
pause();
clrscr();
My_personal_info();
pause();
clrscr();
My_favorite_movie();
pause();
clrscr();
My_favorite_trip();
pause();
clrscr();
My_favorite_book();
pause();
clrscr();
My_favorite_sports();
pause();
clrscr();
return 0;
}
void Greeting()
{
cout << "Welcome to my program!!" << endl;
return;
}
void My_personal_info()
{
cout << "First Name: Jon" << endl;
cout << "Last Name: Berry" << endl;
cout << "Age: 17" << endl;
return;
}
void My_favorite_movie()
{
cout << "Movie Title: " << endl;
cout << "Movie Rating: " << endl;
cout << "Year Released: " << endl;
return;
}
void My_favorite_trip
{
cout << "City and County: " << endl;
cout << "Persons Traveled With: " << endl;
cout << "Year Traveled: " << endl;
return;
}
void My_favorite_book
{
cout << "Book Title: " << endl;
cout << "Book Author: " << endl;
cout << "Book Type: " << endl;
return;
}
void My_favorite_sports
{
cout << "Name of Sports: " << endl;
cout << "To Watch or To Play: " << endl;
return;
}
void pause()
{
char dummy;
cout << endl << "Press Enter to Continue. . ."
cin.get(dummy);
return;
}
void clrscr()
{
system("cls");
return;
}
|
|
|
|
|