|
Thanks a lot for your answer!
There are some other things I need with this "driver". Users should be able to call the dll from visual basic, visual basic.net, c# and c++. That is the reason why some people said I have to use COM.
The first thing I did was develop a usefull architecture for the driver. This is done in UML. But because I normally develop applications using OO, I also designed the driver that way. I wanted the user to be able to call a connection like this:
MyObject->GetPLCConnection(index)->Connect();
But visual basic is not made for OO
Now, I am thinking of this:
1 COM object to communication with the PLC (for single connection). 1 COM object to hold all the connections the user wants.
But then there is one problem left. How do I call functions from the collection COM to the connection COM.
I hope it's clear what I mean...
Thanks a lot so far for your time!
Geert
[url]http://geert.yoki.org[/]
|
|
|
|
|
Hi !
COM offers language indepence, thus it is the most reasonable choice if you want your object to be usable from all languages which support COM. These include, but are not limited to, Visual C++/Basic/C#/.NET. Even PHP supports COM these days...
However, back into the issue. The object-oriented approach is correct on this problem, but it seems you've started with wrong presumptions. First of, you don't need multiple COM objects. A single COM object which has multiple interfaces is enough. One interface for enumerating the available PLC devices and offering an index of the device, a second interface for connecting and disconnecting from the PLC and possibly a third interface which allows reading/writing from the device. And 1...n classes which implement these interfaces. 3 in the biggest case, 1 in the simplest case.
The keyword here is multiple inheritance. Consider this example:
class IEnumPLCDevices
{
public:
virtual DWORD GetPLCList(int* nArray, int& nAmountOfDevices) = 0;
};<DIV>
class IConnectPLCDevice
{
public:
virtual DWORD ConnectToDevice(int nIndex, IPLCDevice** plcDeviceInterface) = 0;
};<DIV>
class IPLCDevice
{
public:
virtual DWORD Read(int nByteCount, void** pDestination) = 0;
virtual DWORD Write(int nByteCount, void* pSource) = 0;
};<DIV>
class PrivatePLCCollection : public IEnumPLCDevices, public IConnectPLCDevice, public IPLCDevice
{
public:
.
.
}; Here is the simplest model I can use to fathom an object-oriented DLL. It is not a COM example, but it follows the 'interface' idealism I showed earlier.
You don't need to seperate the communication and connections to different COM objects. They can co-exist peacefully inside a single object. You must remember here that a COM object is not the same thing as a C++ class. A COM object can have multiple C++ classes inside it. For an example, consider DirectX. It has multiple interfaces, and even more classes. Some classes implement more than one interface. However, each DirectX component is a single, independent COM object, such as Direct3D. You don't need the DirectSound object to use the Direct3D object's services, but the Direct3D object offers all the services to create, populate and manipulate 3D scenes. Lots of services (classes/interfaces), but a single COM object.
I believe there are some examples in CodeProject on writing COM objects. See under General -> COM/DCOM/COM+. You should read the articles marked with 'beginner' through to gain understanding on how COM works. Then you can start implementing your own object, either by following the examples, or simply by exploring.
-Antti Keskinen
----------------------------------------------
"If we wrote a report stating we saw a jet fighter with a howitzer, who's going to believe us ?"
-- R.A.F. pilot quote on seeing a Me 262 armed with a 50mm Mauser cannon.
|
|
|
|
|
Thanks a lot!
Thank god I can still use COM
I have read some tutorials and can get a dll server and client communicate. One question left, and you are the best
I tried to set return values of COM interface methods to BOOL or double. But, it says I MUST use HRESULT. Then why can I choose for the other ones??? And with your example, is it possible to call a plc connect function like this:
MyObject->GetPLCConnection(index)->Connect(). In other words, can I return a pointer to another interface class with a function in a COM object??
Geert
http://geert.yoki.org
|
|
|
|
|
Hi
Tischnoetentoet wrote:
One question left, and you are the best
I'm far from the best, but I know my stuff. Guess that's one of the hazards of being a professional Thanks anyway
All COM methods must return a HRESULT to the client. This is by design, because the clients use SUCCEEDED and FAILED macros to determine if they should continue with or retry the process, and the HRESULT values are designed to support these macros. This way, the client does not need to know what return values the server gives, other than the knowledge that SUCCEEDED and FAILED macros determine if it can continue using the object.
If you must return a value to indicate the amount of PLC objects, you can use a reference variable or a pointer. Just create a function that takes an int& as variable, fill in the number of devices, and return a HRESULT that the enumeration was succesfull. The client can then check the integer to know how many devices there are.
If you follow the standard, like you should, then a call chain like the one you describe is not possible, because each function must return a HRESULT. If you break the standard, you can do whatever you please, but your component is no longer COM compliant, and it might fail to work on a different language. Generally, you shouldn't require the client to build large call chains, instead, implement the HRESULT GetPLCConnection(int nIndex, IPLCDevice** pDeviceInterface). For this function, you pass the index value of the desired device and the interface pointer's address, and it returns you with a success code and a working pointer to the correct interface. IF the device doesn't exist, it NULLs the pointer and returns a failure code.
Another reason for avoiding call chains is the reference counting. Whenever a COM object refers an interface, it increments the counter. When all interfaces are released, the counter goes zero, and the object can free the class responsible for serving this interface. If you build long call chains, the reference counting will not work, and your COM object does not act like a COM object should. Again, because different languages offer different levels of access to COM, your object might work on C++ (which has pointers) but fail on Visual Basic (which doesn't have them). In general, avoid call chains when dealing with COM. It makes your code and documentation much easier to follow for those people who have used COM earlier and know the way it should function. Breaking the standard will cause professionals to life an eyebrow towards your code, even if it would still work.
Hope this helps
-Antti Keskinen
----------------------------------------------
"If we wrote a report stating we saw a jet fighter with a howitzer, who's going to believe us ?"
-- R.A.F. pilot quote on seeing a Me 262 armed with a 50mm Mauser cannon.
|
|
|
|
|
Antti Keskinen wrote:
Hope this helps
And IF it is helpful!
Thanks for all your time and effort! It really helped me a lot! I think I know the basics so I can start trying to develop my own object.
Thanks!
Geert
http://geert.yoki.org
|
|
|
|
|
Hi all,
I am currently trying to find a charting package for our VC++ application. We have a requirement to display data in line, area, scatter, and possibly 2d contour maps. We are displaying large amounts of data which means refreshing quarter of million points in a scatter plot becomes very time consuming.
I would be grateful if anyone could recommend any charting packages which may help.
Many thanks in advance...
|
|
|
|
|
Would an embedded Excel chart suffice?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
You might want to look at GigaSoft.
It's reasonably expensive, but I've used it a lot and seems to work well.
Karl - WK5M
PP-ASEL-IA (N43CS)
<kmedcalf@ev1.net>
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
How to get information about other applications running with our application?
like, Which applications are running currently?
|
|
|
|
|
Are you talking about EnumProcesses() ?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
How can i make a customized keyboard
any idea and suggestions please
|
|
|
|
|
|
If I am wrong what I am asking Plz do correct me
1. How can I change The Source IP in the IP Header
2. How can I change The Source IP in the HTTP Header
Actually I want to sumit some data from my VC App on a form in a web site which does not allow submission more than once from a single IP address
Thnx in Advance
AD
|
|
|
|
|
The following RFCs will help
Internet Protocol[^]
Transmission Control Protocol (TCP)[^]
NOTE: Normally HTTP uses TCP port 80.
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 Walliams (Little Britain)
|
|
|
|
|
Hi,
I have to work on Windows Themes. I should be able to apply different themes to my application. These new themes must be applicaple only to my application and not to the entire Windows. On browsing the Google and other websites I learnt that UXTHEME.DLL has to be used to change the windows themes.
But I have no idea as to how to use this Dll to change the theme of only my application. I need to give an option in my application, say in the form of menu option showing the available themes, and allow the user to select one among them and then apply the theme to my application. My application should work similar to YahooMessager where we can select available skins/themes and it gets applied only to that messenger application.
I have never worked in this area. It would be of great help to me if any one can give me some inputs in this area.
Thanks
Madhavi.
|
|
|
|
|
Hi !
You should consider keeping a data value in registry that tells which 'theme' the user has selected. Then in the application, load this value and paint your windows and controls accordingly. It's called 'skinning an application' and is a very popular theme around the Net.
The UXTHEME.DLL is a library related to Windows Themes (how Windows windows, buttons etc look like). You should never change this DLL, although you can load it to make your application have the 'Windows XP' look and feel.
An alternative is to look for fore-skinned control packages, such as Dundas Ultimate Toolbox or Codejock's Xtreme Toolkit. These both contain hundreds of components in building custom-looking UIs. Both of these toolkits currently focus on providing Office 2003 look and feel.
One option is to just use Paint and draw your UI. Then use window region clipping and painting to push this 'drawing' as your main window. This is how the popular media player Winamp is constructed, for example. All the sections of the window are loaded from a bitmap or graphics file that can be custom generated. Creating a new UI is as easy as drawing a new graphic and making it follow an already working graphic file's layout.
-Antti Keskinen
----------------------------------------------
"If we wrote a report stating we saw a jet fighter with a howitzer, who's going to believe us ?"
-- R.A.F. pilot quote on seeing a Me 262 armed with a 50mm Mauser cannon.
|
|
|
|
|
Hello:
I have developed an MFC exe using a library that uses MFC objects. It pretends to be a driver for Bluetooth. This application uses a modal CDialog as main object. I am trying to convert this app to dll, in order to let the applications accesss bluetooth. I have designed an interface with two exported functions, Read and Write. I have done the dll but when it is initiated by the client it gets blocked as it uses a modal CDialog. I have tried to convert it to modeless but I don´t see the way as it has no parent window. Any idea of how can I solve the problem?
Thanks in advance,
Mikel Fernandez
|
|
|
|
|
lmfernandez wrote:
I have tried to convert it to modeless but I don´t see the way as it has no parent window.
Pass the desktop window as the parent. GetDesktopWindow() should help.
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 Walliams (Little Britain)
|
|
|
|
|
GetDesktopWindow() returns NULL . Do you know any reason?
|
|
|
|
|
Are you trying to use the DLL before there is a desktop. From a driver or a service for instance!?
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 Walliams (Little Britain)
|
|
|
|
|
Hi
I made an application that operates on the serialport. Using "CreateFile" I must include windows.h
Now I have re-written my app and wanted to include an image in the GUI, so I used "Picturebox".
However, with the picturebox and the picture, it looks like I cannot include the headerfile windows.h.
When I include it , I get the message:
error C2039: "GetObjectA" is not a member of "System::Resources::ResourceManager"
This errormessage is pointing to the line in my code dealing with the image.
Does anybody know what I have done wrong?
regards
donE
|
|
|
|
|
Read this...http://www.kbalertz.com/kb_888267.aspx
said ifdef then undef on the getobject.... it is an
issue with including windows.h
If it works, let me know. I get a runtime error
|
|
|
|
|
ok - here is a workaround....
////REMOVE the code the IDE gave you!!!!
//this->pictureBox1->Image = (__try_cast<system::drawing::image *="">(resources->GetObject(S"pictureBox1.Image")));
///ADD This line
this->pictureBox1->Image = Image::FromFile(S"sm_titan.bmp");
This can get all crazy with a file name so here is an example with
a image directory and numbered images:
pictureBox1->Image = Image::FromFile( string::concat( directory::GetCurrentDirectory(), s"\\image\\image", imageNum.ToString(),s".bmp"));
Hope it helps!
|
|
|
|
|
|
Yea, I got the same.... Use the file name <as shown="" in="" above="" post=""> if you can.
That works no problem.
<snip>
picBox->Image = Image::FromFile(S"filePic.bmp")
<snip>
|
|
|
|
|