|
We have our current Web applications designed in ASP.We are planning to migrate this to .NET. Our applications interact with a lot of COM components hosted on MTS.We are planning to migrate all these applications along with the COM component to .NET,i.e., all ASP pages to ASPX and all COM components will be re written into .NET dlls. Okay so far so good.
As a part of our investigations, we are trying to come out with the best possible "replacement" for COM/MTS in .NET. We have thought of 3 techniques:
a.Put all the .net dlls(i.e., COM converted to .NET dlls) into a common folder and and refer them from our Web applications
b.Using .NET remoting: Hosting every .NET dll as a remotable object using a windows service.Our Web applications can consume this remotable object.
c.Using Reflection techniques: By Runtime binding them from Web applications
(Please Note: We do not want to look at Web Services as an option currently)
Can anyone let us know which among the 3 is the best option for converting COM to .NET equivalent(OR is there any other better method )
|
|
|
|
|
We are also currently looking at different options for our midlle tier, ideally we wanted to host inside COM+ which meant making use of .net enterprise services. Unfortunately the imposing com and com+ rules on our .net application is just not practical. We will now use WCF which effectively is remoting but properly layered where you can choose hosting environment and communication protocol.
|
|
|
|
|
Hai,
I am using two COM server Exe's with MFC support.
In my working environment a MFC application will call the COM interface of my COM server 1.
And my COM server 1 calls the interface of my COM server 2( This application has a window ).
On entering the interface call of COM server 2, i had logged that information into a file.
I had also logged the information while exiting that interface call from COM server 2.
In COM server 1, I had put a log just after this interface call (Interface call to COM server 2 )
Issue :- While analysing the log i had found that the interface call of COM server 2 is returned ( By analysing the IN and OUT log that is logged in COM server 2 ). But the log i had put in COM server 1 just after this interface call is not logged. But if I clicked on the window of COM server 2 or MFC application. The log that is put after the interface log is logged.
Can anybody help me?
Regards,
appoos
Known is a drop, unknown is an ocean
|
|
|
|
|
appoos wrote:
Issue :- While analysing the log i had found that the interface call of COM server 2 is returned ( By analysing the IN and OUT log that is logged in COM server 2 ). But the log i had put in COM server 1 just after this interface call is not logged. But if I clicked on the window of COM server 2 or MFC application. The log that is put after the interface log is logged.
Can anybody help me?
Are you sure that the log function you use on COM server one produces instant results? It's a common practice to just store information untill the right occasion comes up to complete the write. I would also look at how the call between the COM servers works. Their might be some problem in that.
Nathan
|
|
|
|
|
Hi All,
we are developing a marquee control for MS Access using VC++ 6.0. The marque text must be centered in the control. The centering of text work's fine in forms whether it is in design mode or running mode. But for reports the text shows centered in the design mode but in preview mode it goes wrong. The problem is actully found only with MS Access 2000 and it works fine for Acess 2002.
Can anyone help me to solve this problem.
thanks & regards
Nitheesh
|
|
|
|
|
I'm totally new to ActiveX and don't know where to get started. Hoping you can help.
My plan is to develop an ActiveX component (MSVC++) for the purpose of being used by IE. I need the ActiveX component to store information in persistent storage.
I have a bunch of HTML + JS that currently uses a signed Java applet for reading/writing files to the hard disc.
I would like to remove my applet in favour of ActiveX.
Anyone got pointers to sample sources and good guide to storing persistent data from ActiveX.
Lastly, when searching around the net I can't find a great deal of useful ActiveX stuff. Is ActiveX more commonly referred to as something else?
Appreciate any help you can offer. TIA.
|
|
|
|
|
earlp wrote:
I have a bunch of HTML + JS that currently uses a signed Java applet for reading/writing files to the hard disc.
I would like to remove my applet in favour of ActiveX.
Why do you want to do that? The signed java applet looks like a more appropriate tool to me.
Nathan
|
|
|
|
|
Valid question
My users are not very technical and may not have JVM installed, consequently when installing my software they need to install the Sun JVM. I know it sounds easy but it's a step that worries/scares them. So the current solution works but I'd like to simplify. I basically need my IE based "application" to work off-line with ability to store data and then at a later date to submit the data via a built-in SMTP client that I wrote in Java. By removing Java I lose the "save to local HDD" feature, DES encryption of the data and SMTP (which is used for sending me the data when they're online). SMTP, I will replace with a standard "form submit" to a back-end PHP process. Encryption of the data I would want to do in the ActiveX code.
So bottom line; it's all about simplifying for my very non-techie end-users.
I've thought about GoogleGears but I'm concerned that that may create additional complications with installation.
So here I am looking at ActiveX which looks promising; I can write code to easily access the HDD and from experience relatively straight forward to add DES encryption.
I'd welcome your thoughts.
|
|
|
|
|
I'm afraid I don't know much about using ActiveX or Automation with Internet Explorer. I haven't even used encryption, though it's something I want to learn. Also, I've noticed that no one else seems to have responded to your question. I think people might know more in the Web Developement forum.
Nathan
|
|
|
|
|
Heh... it's a deep well, Earl. Where would you like to start? I'll help where I can. I would say I'm intermediate developer now with activeX, but there is a huge conceptual hill you have to climb. When all of a sudden you say, "Wow!", you're at the top of the hill.
How's your VC++?
Charlie Gilley
Will program for food...
|
|
|
|
|
Hi Charlie. Thanks for your response. At this stage I'm trying to understand if my approach makes sense. e.g. to use ActiveX. If it is, then the next step is for me to understand what I need to do in order to have an ActiveX "thing" that allows my JS/HTML to call into it for purpose of reading and writing files. My VC++? .... I've been around for a while so fairly confident ... that said, I don't know where to start. Any advice?
|
|
|
|
|
Hi,
I'm writing a ATL COM Service (with the wizard on VC2003).
it look like that :
// IDeviceManager
[
object,
uuid("D9D097B1-FBE8-43D8-AEC6-6C740D01E911"),
dual,
helpstring("IDeviceManager Interface"),
pointer_default(unique)
]
__interface IDeviceManager : IDispatch
{
// Device manager.
[id(1), helpstring("method EnumDeviceDriver")] HRESULT EnumDeviceDriver([out,retval] LONG * pDeviceDriverCount);
....
}
// _IDeviceManagerEvents
[
dispinterface,
uuid("55370094-D0DE-438C-8D0A-E907A884F50B"),
helpstring("_IDeviceManagerEvents Interface")
]
__interface _IDeviceManagerEvents
{
[id(1), helpstring("method OnFireDeviceEvent")] HRESULT OnFireDeviceEvent ( [in] ULONG iDevice, [in] BSTR Param1, [in] BSTR Param2, [in] BSTR Param3, [in] BSTR Param4, [in] BSTR Param5, [in] BSTR Param6, [in] BSTR Param7, [in] BSTR Param8, [in] BSTR Param9 ) ;
};
// CDeviceManager
[
coclass,
threading("apartment"),
event_source("com"),
vi_progid("Manager.DeviceManager"),
progid("Manager.DeviceManager.1"),
version(1.0),
uuid("5CCB5A39-BF78-40A4-89E4-D0DBE82D8B7D"),
default(IDeviceManager),
helpstring("DeviceManager Class")
]
class ATL_NO_VTABLE CDeviceManager :
public IObjectWithSiteImpl<cdevicemanager>,
public IDeviceManager
{
public:
CDeviceManager ();
__event __interface _IDeviceManagerEvents;
DECLARE_PROTECT_FINAL_CONSTRUCT()
...
}
When i fire an event in EnumDeviceDriver it work.
The CDeviceManager container a thread that try to fire event but it failed with RPC_E_WRONG_THREAD(0x8001010EL).
I see a lot of article that say i need to modify advice and unadvice but with the Wizard i don't found how do it...
A link to expert exchange that explain a solution but not with the vc2003 wizard generated code: http://209.85.129.104/search?q=cache:HcncZHwaAUoJ:www.experts-exchange.com/Programming/Languages/CPP/Q_20528104.html+queryinterface+IDispatch+0x8001010E&hl=fr&ct=clnk&cd=1&gl=fr
If someone can explain me how do it with my code ?
Thanks
-- modified at 5:52 Thursday 8th November, 2007
...
|
|
|
|
|
The main thing here is that you're using an interface from another apartment than it was created in.
When you're crossing apartment boundaries you have to marshal the interface.
When it comes to firing events I've found Michael Lindig's solution to satisfy my needs; check it out here[^].
If you want to know more about marshalling and multithreaded COM you should read Lim Bio Liong's article series starting here[^].
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Hi,
Thanks for the answer but i already see this article, the problem is how integrated it to my code, i understand the problem, and i have a lot of solution but i can found have integrated it
I try a lot of things like this (remove wizard event and implement it manually => It crash, like the sample of Michael Lindig's.
If you have a small working sample (client\server) i will be happy... Multithread event is very hard for me, i found how do it in single thread on 10 minutes... And for multithread, i search from 4 days...
My last try that crash on start…
// CDeviceManager
[
coclass,
threading("apartment"),
//event_source("com"),
vi_progid("Essilor.Manager.DeviceManager"),
progid("Essilor.Manager.DeviceManager.1"),
version(1.0),
uuid("5CCB5A39-BF78-40A4-89E4-D0DBE82D8B7D"),
default(IDeviceManager),
helpstring("Essilor DeviceManager Class")
]
class ATL_NO_VTABLE CDeviceManager :
public IObjectWithSiteImpl<<cdevicemanager>>
, public IDeviceManager
, public IConnectionPointImpl<<cdevicemanager, &__uuidof(_idevicemanagerevents),="" ccomdynamicunkarray_git="">>
{
public:
CDeviceManager ();
//__event __interface _IDeviceManagerEvents;
...
Thanks for your help.
Arnaud
...
|
|
|
|
|
achainard wrote: Multithread event is very hard for me
Well, nobody said it would be a walk in the park.
That's why I suggested that you read up on the subject in Lim Bio Liong's article series to get a basic understanding.
achainard wrote: i found how do it in single thread on 10 minutes...
Of course you can post a message to the main thread of the server and fire the event from there.
achainard wrote: My last try that crash on start…
So, why does it "crash"? Look in the call stack for clues.
BTW, you are aware that Michael's implementation is in C++, right?
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
It's definitively a good day...
I found : use CoMarshalThreadInterfaceInStream and CoGetInterfaceAndReleaseStream...
Thanks for your help,
Arnaud
...
|
|
|
|
|
In c++ I could overload the class which implements the calls to the COM / Active X object I used and add additionally member functions in the overloaded class.
How do that in c# with NET ? The "object" I get is only an interface with a CoClass. Deriving from the interface without implementation of all functions of the CoClass is not possible ... I dont have any dispatch pointer etc...
The member function should access a static Hashtable which returns some values.
Any Idea ?
|
|
|
|
|
FriendOfAsherah wrote: In c++ I could overload the class which implements the calls to the COM / Active X object I used and add additionally member functions in the overloaded class.
How do that in c# with NET ? The "object" I get is only an interface with a CoClass. Deriving from the interface without implementation of all functions of the CoClass is not possible ... I dont have any dispatch pointer etc...
The member function should access a static Hashtable which returns some values.
Any Idea ?
In C#, I think you're reduced to writing a class that contains the COM object. Your class could implement the interface by just passing the calls on to the contained object, but it's still a lot more work than you'd need in C++.
Nathan
|
|
|
|
|
Yes, but away from defining about 40 properties,functions get/set I dont know how to write them becouse:
The Interface class shows only the definitions like:
[DispId(0)]
string _Name { get; set; }
The CoClass similar like:
[DispId(0)]
public virtual string _Name { get; set; }
Which code to write into the class which inherits from the Interface ???
public class CMyClass : ICOMClass
{
public virtual string _Name { get { ??? }; set{ ??? }; }
....
I cannot leave the get/set empty but I dont have any parameters
Or how can I put something like a DispatchId and a dispatch pointer there ??
|
|
|
|
|
FriendOfAsherah wrote: Yes, but away from defining about 40 properties,functions get/set I dont know how to write them becouse:
The Interface class shows only the definitions like:
[DispId(0)]
string _Name { get; set; }
The CoClass similar like:
[DispId(0)]
public virtual string _Name { get; set; }
Which code to write into the class which inherits from the Interface ???
public class CMyClass : ICOMClass
{
public virtual string _Name { get { ??? }; set{ ??? }; }
....
I cannot leave the get/set empty but I dont have any parameters
Or how can I put something like a DispatchId and a dispatch pointer there ??
My guess is it would be:
public class CMyClass : IComClass
{
private IComClass m_Inner;
public virtual string _Name
{
get {return m_Inner._Name;}
set{m_Inner._Name = value}
}
...
and the constructor would set m_Inner to a new instance of ComClass, or use one provided to it.
Nathan
|
|
|
|
|
How easy ... by containment ...
This works !!
I spend hours trying to use typecasting and calling base.Function() and base.Property=...
This is the COM Interface I have:
[CoClass CCOMClass]<br />
...<br />
public interface ICOMOuter : ICOMInner<br />
{
}<br />
<br />
public interface ICOMInner<br />
{<br />
[DispId1]<br />
public string Property1 { get; set; }<br />
... etc.<br />
}<br />
And I tried derive, inherit with:
public class MyClass : ICOMOuter<br />
{ ....<br />
}<br />
And
public class MyClass : ICOMOuter , ICOMInner<br />
{ ...<br />
}<br />
both never compiled ....
Dont know why until now
Thanks a lot :-Dfor the idea !
|
|
|
|
|
Creating a COM dll -module that fires events is simple enough (ATL -project -> add ATL simple object with Connection point -support -> Add a couple methods etc.), but:
What flags are needed for multiple instances to catch the same event when it is fired? I.e. when I CoCreateInstanceEx a connection to module from let's say 2 separate exe's, both can receive the same event. Tried quite a few combinations so far and yet no success.
|
|
|
|
|
You need another Class Factory. Use the DECLARE_CLASSFACTORY_SINGLETON macro. In this case all COM-clients get the same instance. In this case your COM-Object must be threadsafe !
Greetings
|
|
|
|
|
Even with singleton COM objects if it is an in-process component then you'd still get separate notifications from multiple EXE clients. You would either have to make the component out-process or CoCreateInstance it from one EXE and load it up into the Running Object Table (ROT) using RegisterActiveObject and grab a reference to it from the second EXE using GetActiveObject .
|
|
|
|
|
That did the trick. Thanks a lot!
|
|
|
|