|
hi experts,
I'm quite new to the topic of COM and Automation and I have a few basic problems and questions:
I modified my existing MFC application to a multithreaded Automation server with the help of a tutorial i found on http://www.codeproject.com/com/mfc_autom.asp and made it via coinitializeex running as multithreaded, the application is a .exe
and lateron call COleTemplateServer::RegisterAll(),
but when I try to get an active instance via hr=GetActiveObject(clsid) I get as result: 0x800401e3 operation unavailable
and if i try to create a new instance via
hr=::CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IApplication1, (void**)&m_IApplication))
it returns the active instance instead of creating a new one
I also use another project with automation and there getactiveobject and cocreateinstance works fine
I think as COleTemplateServer::RegisterAll() returns TRUE it should correctly register my objects with the ROT (which if not, could be the reason for getactiveobject returning an error) or am I wrong?
So has anyone an idea how I become it working to getactiveobject() returning the active object and cocreateinstance() creating a new one
with best regards Stefan Buchner
|
|
|
|
|
Hi guys,
This activex control has optionals parameters for GetData method:
this.axWinsock1.GetData(ref object data,object type,object maxlen)
i tried these:
object rec= string.Empty;
object type = 0;
object maxlen = 0;
this.winsock.GetData(ref rec, type, maxlen);
or
object rec= string.Empty;
object type = string.Empty;
object maxlen = string.Empty;
this.winsock.GetData(ref rec, type, maxlen);
but all i get is "Unsupported variant types" error message, do you know how to call this getdata method in c#? i know if you call it in vb.net you dont need to pas optional parameteres.
Please help
|
|
|
|
|
Don't use this control in C#. Instead, use the System.Net.Sockets.Socket class, or the TcpClient , UdpClient , TcpListener classes which are a little more friendly to use.
The data you get from the socket will be in raw bytes. You will need to use one of the System.Text.Encoding classes to turn text from the byte-oriented wire format into a string . As a starting point, try Encoding.Default .
|
|
|
|
|
ActiveDocument gives error whenever i open any existing document..
CType(applicationObject, Word.Application).CustomizationContext = CType(applicationObject, Word.Application).ActiveDocument
CType(applicationObject, Word.Application).ActiveDocument.Saved = True
"You can do any thing you set to your mind" - theGhost_k8
|
|
|
|
|
oh !! i missed out the important part..
well this works fine when i go:- start-> run-> winword
it works fine when i go with debuging..
but if i run existing document by double clicking... it gives error .. specifying activeDocument not exist..
"You can do any thing you set to your mind" - theGhost_k8
|
|
|
|
|
Hai,
I am Installing an application after building .But at the time of Installation ,i got following error ,
Error 1309.Error Reading from file:
C:\Windows\Downloaded Installations\
{FD9A9617-3D4A-4B1A-BA58-D87368B26335}\prograam files\SaleMask\...\nanaDisp.exe.
Verify that the file exists and that you can access it.
Any one please help me to recognize the problem and solving the same.
Thanks in advance
Jeeva
|
|
|
|
|
Jeeva Mary Varghese wrote: Verify that the file exists and that you can access it.
As error says, verify it.
|
|
|
|
|
Prasad,
Yes the files are existing and they are not in read Only.
Jeeva
|
|
|
|
|
Can you run the nanaDisp.exe manually ?
Darka [ Xanya]
"I am not a slave to a god that doesn't exist."
|
|
|
|
|
well, there is a html file with this : ( I'll call it codez)
I want to do something before the someFunction() is called;
but,firstly,I must tell you that I only want to deal with the Event just when the onLoad is to be called,or being called. I don't want to deal with the event in DWebBrowserEvents2 with BeforeNavigate2 event,etc.
Following the MSDN, I found HTMLWindowEvents2, I thought DISPID_HTMLWINDOWEVENTS2_ONLOAD can be triggered when the codeZ is executed.But, disapointed, I can just get DISPID_HTMLWINDOWEVENTS2_ONUNLOAD and DISPID_HTMLWINDOWEVENTS2_ONBEFOREUNLOAD .
Whenever and Whatever html I visit,DISPID_HTMLWINDOWEVENTS2_ONLOAD is never received .
so. Can anybody help me???Maybe I should implements another interface??
Than you !!!!
|
|
|
|
|
Hi All,
I call a function fun()which is defined in X.dll .
the below is the code which is simillar to actual code.
when i execute i get as exception.
// sample.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream.h"
#include "iomanip.h"
#include <algorithm>
#include <vector>
void fun(long **a);
int main(int argc, char* argv[])
{
long *amount = NULL;
fun(&amount);
long *ptr = amount;
for (int i = 0; i<5 ;++i,++ptr)
{
cout<< *ptr <<endl;
}
="" delete="" []amount;="" here="" i="" get="" an="" exception="" when="" try="" to="" delete.
="" return="" 0;
}
void="" fun(long="" **a)
{
="" *a="new" long[5];
=""
="" std::vector<long=""> var;
var.push_back(5);
var.push_back(6);
var.push_back(65);
var.push_back(58);
var.push_back(57);
std::vector<long>::iterator i;
int k = 0;
for(i= var.begin();i != var.end();++k, ++i)
{
(*a)[k] = *i;
}
}
the fun() is defined in the X.dll
Please let me know why i get an exception when i use delete []amount.
The same code works in the normal app, but when same mechanism is used in dll it does'nt work. the above code runs perfectly. i have the same code in the dll, the fun() is defined in the dll and the main() is in the application from which i use the interface to access the fun().
Thanks in advance..
Thanks & Regards,
Dhana
|
|
|
|
|
Why you are repositng same[^] question, asked few days back ? Doesn't that solve your problem ?
And what is there in this question related to COM?
|
|
|
|
|
Thanks for the solution and also to your concern..
Though that solved the problem..my actual problem is in the com component i am using. i thought i should put this question in the COM message board. i have given the exact scenario, the fun() is present in the COM Dll. If memory is allocated in the DLL using 'new' can i 'delete' the same in the application outside the dll?
Thanks & Regards,
Dhana
|
|
|
|
|
jana_dhana wrote: i have given the exact scenario, the fun() is present in the COM Dll.
Its not COM dll, its simple dll.
jana_dhana wrote: If memory is allocated in the DLL using 'new' can i 'delete' the same in the application outside the dll?
Yes, but you are incrementing base address, and then deleting it.
Adopt method given in my previous solution to access the pointer.
|
|
|
|
|
jana_dhana wrote: If memory is allocated in the DLL using 'new' can i 'delete' the same in the application outside the dll?
Yes, and no. Yes, if you use the same version of the C/C++ runtime libraries [in .exe and .dll], and if the pointer is passed between DLL and application without going through a marshaled interface (which is next to impossible to determine, given only an interface pointer).
My advice to you is to allocate memory using CoTaskMemAlloc and CoTaskMemFree. This way you don't have to worry about which heap (different runtime libraries use different heaps) the memory was allocated on.
--
Transmitido en Martian en SAP
-- modified at 17:29 Wednesday 18th October, 2006
|
|
|
|
|
Thank You Very Much..Your Suggestion helped me very much.
Thanks & Regards,
Dhana
|
|
|
|
|
For COM memory allocation, use CoTaskMemAlloc CoTaskMemAlloc[^]
For deallocation, use CoTaskMemFree[^]
S o h a i l K a d i w a l a
To Err Is Human; to Debug, Divine
modified 21-Apr-21 21:01pm.
|
|
|
|
|
Thank You...
Thanks & Regards,
Dhana
|
|
|
|
|
Hi All,
We have a project which is standard exe. Our new requirement is to convert it into a COM application. I would like to know what are the minimum steps required to make a standard exe application (that is make minimal changes to existing code)into a COM one. Any links or suggestions would be most welcome.
Thanks
C++beginer
|
|
|
|
|
I have to ask why you want a 'COM application'. Generally the only reasons for exposing existing code as COM objects are to support OLE linking and embedding, or to offer an automation interface to allow your program (and its data) to be manipulated by another application.
If you simply want to write some COM objects which run in another process context, with no user interface, you generally don't start from an existing program. If I were starting from scratch in C++ I would use the ATL AppWizard to generate a new EXE project.
The easiest way to support the first two requirements - OLE and/or Automation - will depend on the language and libraries you have used to produce your application. If you're already using MFC, you will probably want to use MFC's OLE support, which is based around the CDocument class. See the Servers: Implementing a Server[^] topic in MSDN Library.
If you're using C++ but not MFC you may find ATL helpful. However, it's pretty complex for a beginner.
|
|
|
|
|
Actually its a requirement from the client. The existing app is used as a component manager. It is used to start/stop/activate/deactivate etc other modules. Now the client is changing the interfaces of the other modules. And we will have to use those changed interface. So its not a question of converting an exe to com, rather we have to make it a com server. How we do it is left to us. Either we can start from the scratch (that will be lot rework) and build a com application or use the existing one, make the necessary changes with respect to com standards and run it as a com server. I hope you got the point.
C++beginer
|
|
|
|
|
Hi,
you need not write it from the scratch, if it is a c++ application, just register your application with SCM(service control manager)so that an entry is made into SCM for controlling your service..just what you need is two functions...
Service_main and
Service_CtrlHandler
in the start up you will be giving Service_main function to SCM and inside Service_Main you will be registering Service_CtrlHandler...normally Service_CtrlHandler will be containing evets like SERVICE_STOP, SERVICE_PAUSE e.t.c...so when ever you are performing an event like SERVICE_STOP, Service_CtrlHandler will be called to perform necessary functionality.Hope this will help you
mpk1979
|
|
|
|
|
I think you've misunderstood the question - or possibly I have - but it sounds like this application needs to load COM objects, not be turned into a service.
|
|
|
|
|
ohh, sorry i think i have misunderstood it
|
|
|
|
|
So you're saying that the interface to the other modules is changing from a flat interface (calling into DLL entry points) to a COM interface (calling through an interface pointer)?
The client should be able to supply you with the interface that the other modules will expose. Ideally they would be able to supply the .idl file containing the interface definition(s) or the .h file that is generated from the .idl. Worst case, you might have to use #import to get the compiler to extract the interface(s) from a type library. It depends how the components are implemented; if they're in C++ you can probably get the .idl or header. You will have to compile the IDL with the MIDL tool.
If you just need to manipulate, call through, those interfaces, you don't really need to do anything special. I normally use ATL's CComPtr and CComQIPtr class templates to manage the reference counts properly. Include the atlbase.h header to use these templates.
If the component has to call back into your manager application, then you will have to check with the client how they intend to do this. The simplest way from your application's perspective is if you define a regular COM interface containing the methods that the component will call, and pass this to a method in the component's interface. You will then need to implement a class that implements the interface. You might find ATL helpful to do this.
If the components are written in some other language, they may not be able to handle this. They might be raising events using the Automation event mechanism. This will require you to implement the dispatch interface defined in the component's type library (shown as a 'source' interface) so that the component can call you back, and to call the component's connection point container to connect your callback interface to the component. See ATL's CONNECT sample[^] for an example of how to do this.
|
|
|
|