|
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.
|
|
|
|
|
Well our requirement is to turn our exe into a com server. The question is whether we can do so without starting from the scratch. What I am looking at is, we will add the COM interface and implementing classes to the project and build the exe as a com exe by, if possible changing the project settings. I was just wondering is there any well defined steps for this.
C++beginer
|
|
|
|
|
yes, you need to add your functionality to interfaces and implement a class for it. i think ATL would be the best option
mpk1979
|
|
|
|
|
I have created some applications using a lot of techniques to access the properties of the control in a form on screen, such as: Accessibility for Windows controls corperating with some supported API functions. However, for MathLab application, which is written by the Java language, it doesn't operate. Who knows, please tell me the way to solve this issue. Thanks.
|
|
|
|
|
Hello, developers!
I have a problem, and i don't know how to solve it. Below i describe this situation:
I have a COM object(in C++) without TypeLIB and I there is a late bound client in C#.NET. During work
a COM object send different events to client. And i don't know, how i can recieve this events in C#. If a had a C++ client, i would write this code:
#include "stdafx.h"
#include <basetyps.h>
#include <unknwn.h>
#include <comdef.h>
#include <atlbase.h>
#include <atlcom.h>
#include <ocidl.h>
#include <iostream>
using namespace std;
_COM_SMARTPTR_TYPEDEF(IConnectionPointContainer, __uuidof(IConnectionPointContainer));
_COM_SMARTPTR_TYPEDEF(IConnectionPoint, __uuidof(IConnectionPoint));
_COM_SMARTPTR_TYPEDEF(IEnumConnectionPoints, __uuidof(IEnumConnectionPoints));
class CoFomatikEventSink : IDispatch
{
public:
enum DISPIDS
{
DISPID_OnStateChanged = 1,
DISPID_OnProgressChanged,
};
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo);
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
CoFomatikEventSink() : cookie(0), refCount(1) {}
~CoFomatikEventSink() { Disconnect(); }
bool Connect(IUnknownPtr object);
bool Disconnect();
// Event Handlers
void OnStateChanged(IUnknownPtr state);
void OnProgressChanged(UINT value, const BSTR text);
private:
IConnectionPointPtr defaultConnectionPoint;
ULONG cookie;
ULONG refCount;
};
STDMETHODIMP_(ULONG) CoFomatikEventSink::AddRef(void)
{
return ++refCount;
}
STDMETHODIMP_(ULONG) CoFomatikEventSink::Release(void)
{
if(--refCount == 0)
{
delete this;
return 0;
}
return refCount;
}
STDMETHODIMP CoFomatikEventSink::QueryInterface(REFIID riid, void** ppv)
{
if(riid == IID_IUnknown)
*ppv = (IUnknown*)this;
else
if(riid == IID_IDispatch)
*ppv = (IDispatch*)this;
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
((IUnknown*)(*ppv))->AddRef();
return S_OK;
}
STDMETHODIMP CoFomatikEventSink::GetTypeInfoCount(UINT *pctinfo)
{
*pctinfo = 0;
return S_OK;
}
STDMETHODIMP CoFomatikEventSink::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{
*ppTInfo = NULL;
return E_NOTIMPL;
}
STDMETHODIMP CoFomatikEventSink::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
for(UINT i = 0; i < cNames; ++i)
{
if(_wcsicmp(rgszNames[i], OLESTR("OnStateChanged")) == 0)
{
rgDispId[i] = DISPID_OnStateChanged;
}
else
if(_wcsicmp(rgszNames[i], OLESTR("OnProgressChanged")) == 0)
{
rgDispId[i] = DISPID_OnProgressChanged;
}
else
return DISP_E_UNKNOWNNAME;
}
return S_OK;
}
STDMETHODIMP CoFomatikEventSink::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
switch(dispIdMember)
{
case DISPID_OnStateChanged:
{
if(pDispParams -> cArgs == 1)
{
OnStateChanged(pDispParams->rgvarg[0].punkVal);
return S_OK;
}
}
break;
case DISPID_OnProgressChanged:
{
if(pDispParams -> cArgs == 2)
{
OnProgressChanged(pDispParams->rgvarg[0].uintVal,pDispParams->rgvarg[1].bstrVal);
return S_OK;
}
}
break;
}
return DISP_E_UNKNOWNINTERFACE;
}
bool CoFomatikEventSink::Connect(IUnknownPtr object)
{
IConnectionPointContainerPtr connectionPointContainer = object;
IEnumConnectionPointsPtr enumConnectionPoints;
ULONG numConnectionPoints = 0;
connectionPointContainer->EnumConnectionPoints(&enumConnectionPoints);
if(enumConnectionPoints->Next(1, &defaultConnectionPoint, &numConnectionPoints ) == S_OK)
{
if(defaultConnectionPoint->Advise(this, &cookie) == S_OK)
{
cout<<cookie<<endl;
return="" true;
="" }
="" defaultconnectionpoint="NULL;
" cookie="0;"
="" false;
}
bool="" cofomatikeventsink::disconnect()
{
="" if(cookie)
="" {
="" defaultconnectionpoint-="">Unadvise(cookie);
defaultConnectionPoint = NULL;
cookie = 0;
}
return true;
}
void CoFomatikEventSink::OnStateChanged(IUnknownPtr state)
{
/* OnStateChanged handler HERE */
}
void CoFomatikEventSink::OnProgressChanged(UINT value, const BSTR text)
{
/* OnProgressChanged handler HERE */
}
// ===========================================================================
int main(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
{
IUnknownPtr fomatik;
fomatik.CreateInstance("MyCOM.Application");
CoFomatikEventSink* ev = new CoFomatikEventSink();
ev->Connect(fomatik);
ev->Release();
}
::CoUninitialize();
}
But i don't know how i can implement IDispatch in C#? Yes, i know, that RCW and CCW do all work to marshal parameters and call functions, and implement IUnknown and IDispatch, but in my application it is neccesary to implement IDispatch myself, because i don't have a TypeLIB for COM object and that's way i can't cache DispIDs from another source.. I have been trying to write this event handler already 3 days, but unsuccessful!!!!
Plese, if anybody know how to solve this problem, help!
Big, hearty thanks in advance!!!!
|
|
|
|
|
I advise you to use 'pre' tags, for readable code. For getting solution.
|
|
|
|
|