|
Hi,
I have created one ActiveX Full control, and I'm using it through a TLB in my MFC client App, I need to get the interface to IDataObject, but it didn´t work out, I have tried two ways, the "smart one" ( pBaseMeta is an smart pointer to my control BSREPORTCTRLSLib::IBsMetafilePtr pBaseMeta):
IDataObjectPtr DataObj;
DataObj = pBaseMeta;
The good old one...:
IUnknown *pUnk = NULL;
IDataObject *pDataObj = NULL;
pBaseMeta.QueryInterface(IID_IUnknown, (void **)pUnk);
pUnk->QueryInterface(IID_IDataObject, (void **)pDataObj);
Here even a QI to IUnknown returns me NULL !
Should I forget TLBS and all that wrappers and directyle use CLSID's... and GUIDS and AddRef and..., is so sh*tty this ?
Thanks in advance
Braulio
|
|
|
|
|
Use debugger to step into pBaseMeta.QueryInterface - you'll be able to check what's exactly going on. Maybe smart pointer isn't initialized correctly.
Tomasz Sowinski -- http://www.shooltz.com ** If you're going to rape, pillage and burn, be sure to do things in that order. **
|
|
|
|
|
Hi,
I tried to debug, but I can not go too deep ( I´m manipulating the activeX ( that is on one Word automated instance), from my MFC app.
The HResult that I get is: 0x80070057
Any idea why can this be ?, Thanks in advance, Greetings
Braulio
|
|
|
|
|
Braulio Díez wrote:
The HResult that I get is: 0x80070057
This means that 'The parameter is incorrect.' - you can use ErrorLookup program available from Tools menu in VC IDE.
Anyway, did your QueryInterface call go into COM? Or it quits early?
Tomasz Sowinski -- http://www.shooltz.com ** If you're going to rape, pillage and burn, be sure to do things in that order. **
|
|
|
|
|
If I call
pBaseMeta->QueryInterface(IID_IDataObject, (void **)pDataObj);
it goes into this:
Interface* operator->() const throw(_com_error)
{
if (m_pInterface == NULL) {
_com_issue_error(E_POINTER);
}
return m_pInterface;
}
If I call:
pBaseMeta.QueryInterface(IID_IDataObject, (void **)pDataObj);
I cannot go deeper than:
template<typename _InterfaceType> HRESULT QueryInterface(const IID& iid, _InterfaceType*& p) throw ()
{
if (m_pInterface != NULL) {
return m_pInterface->QueryInterface(iid, reinterpret_cast<void**>(&p));
}
return E_POINTER;
}
Maybe it can fail because the ActiveX is holded on a Word Instance, and that only accept IDispatch or dual interfaces ?
|
|
|
|
|
Hello guys
Is there any way to take a print out of the DB structure of an MS access database. When I open any table in design view, the print icons get disabled.
I tried exporting to mysql, but the problem is the data types get changed.
I dont want to sit and type in each table with all the fields and their characteristics.
I badly need some tool that will let me take a print out of the DB structure
Nish
p.s. thanks in advance
I am looking for a free racing game. Old style racing game without any complicated 3D stuff. Around 4 MB download. If anyone has such a game, please inform me.
|
|
|
|
|
First of all, this is very bad place to ask questions about MS Access.
Second, you can iterate over tables/queries/relationships using VBA. In fact, I was once working on a project in which we were doing DB design in Access and next exporting the schema as sql scripts to SQL Server.
Tomasz Sowinski -- http://www.shooltz.com ** If you're going to rape, pillage and burn, be sure to do things in that order. **
|
|
|
|
|
I took the best option out.
Asked my colleague to manually type the table design into word
She finished in 30 mins.
Nice of her I say
Nish
I am looking for a free racing game. Old style racing game without any complicated 3D stuff. Around 4 MB download. If anyone has such a game, please inform me.
|
|
|
|
|
It works, but only if you have toy database with small number of tables.
Tomasz Sowinski -- http://www.shooltz.com ** If you're going to rape, pillage and burn, be sure to do things in that order. **
|
|
|
|
|
Tomasz Sowinski wrote:
It works, but only if you have toy database with small number of tables
Yeah.
This one had only 6 tables each with 6-7 fields
Nish
I am looking for a free racing game. Old style racing game without any complicated 3D stuff. Around 4 MB download. If anyone has such a game, please inform me.
|
|
|
|
|
If its that urgent, try just using Print Screen to capture the screen.
On the relationships screen (which kind of shows table design) there is a "Print Relationships..." item in the File menu. It didnt work for me, but it might work for you.
--
David Wengier
Sonork ID: 100.14177 - Ch00k
|
|
|
|
|
David Wengier wrote:
try just using Print Screen to capture the screen.
Not very useful.
Cause I wont get all the field properties.
I'll only get field properties for the currently selected field
Nish
I am looking for a free racing game. Old style racing game without any complicated 3D stuff. Around 4 MB download. If anyone has such a game, please inform me.
|
|
|
|
|
Access used to let you print the table layout via the Tools->Analysze->Documentor menu option. It's been a few years since I last tried it, so it might have moved.
You could write a quick app using ADOX to get the table structure. I think there is a good example on MSDN.
Michael
|
|
|
|
|
Hi,
I want to pass a metafile to my com server using IDataObject, in my MFC client App I do this:
IDataObjectPtr DataObj;
DataObj = pBaseMeta;
if(DataObj) {
FORMATETC Fe;
Fe.cfFormat = CF_ENHMETAFILE;
Fe.ptd = NULL;
Fe.dwAspect = DVASPECT_CONTENT;
Fe.lindex = -1;
Fe.tymed = TYMED_ENHMF ;
STGMEDIUM Medium;
Medium.tymed = TYMED_ENHMF;
Medium.hEnhMetaFile = hMeta;
HRESULT hr = DataObj->SetData(&Fe, &Medium, TRUE);
}
and in my COM Server ( full ActiveX ctrl that inherits from IDataObjectImpl), I override the SetData method:
STDMETHODIMP CSCurveMeta::SetData(FORMATETC *pFormatetc, STGMEDIUM *pmedium, BOOL fRelease)
{
if(pFormatetc->cfFormat != CF_ENHMETAFILE) {
::MessageBox(NULL, ":-((", ":-(( No metafile...", MB_OK);
return E_NOTIMPL;
}
if(pmedium->hEnhMetaFile != NULL) {
}
return S_OK;
}
But that method is never executed ( the call of SetData made in the MFC client app makes nothing...).
What I´m doing wrong ?, Thanks in advance, Bye !
Braulio
|
|
|
|
|
Braulio,a obvious question do you tried to step in setData in the client ?
HRESULT hr = DataObj->SetData(&Fe, &Medium, TRUE);
what hr displays ?
Tip , in the watch varibles format the hr variable as hr, hr . Add the virgul then the format specifier hr what hr displays ... E_NOTIMPL ?
Or Simply add this @EAX,hr -> the eax register holds the return value of functions and adding hr , format the variable to show the message instead of a hex or decimal number ... it's like calling error lookup
Joao Vaz
|
|
|
|
|
Hi Joao !
I tried that but it doesn´t enter there, HResult returns 0xC0...05 "Access Violation". I created a Dummy project ( and compiled and registered the PStub DLL and tried the same and it gave the same error message).
The only special thing is that the DLL is in the same process space than Ms Word, but my application ( from where I handle the ActiveX), is in a different process space.
I don´t know what I´m making wrong, I've tried making a method and saving to an stream the metafile, then instead of passing the IStream pointer, make a cast from HGlobal to VT_I4 and in the ActiveX, make a casting again to HGlobal, then get the stream from there, but it didn´t work as well...
I´m tempted to use some classic stuff.... Named Pipes or things like that I know they really work...
Braulio
|
|
|
|
|
By the way Joao
I´m trying to pass the HGlobal handler to my ActiveX, the problem is that there is no type for that in OleAutomation, the most similar thing is VT_I4, is ok to use that? I mean casting to VT_I4 and in the ActiveX back to HGlobal ?
Thanks !
Braulio
|
|
|
|
|
HGLOBAL ???
HGLOBAL is a Handle and in win32 is a void* , so you must pass a pointer , not VT_I4.
Joao Vaz
|
|
|
|
|
Hi,
Yes, but to conform with IDL and OleAutomation definition types, could I use (void *)? Or will it give me a warning saying that is not an OleAutomation valid type ?
Braulio
|
|
|
|
|
F*** ! You can't pass a void* , damn it, it was my fault. Here is the automation data types you can pass:
boolean -> Data item that can be true or false; size of unsigned char
unsigned char -> 8-bit unsigned data item
double -> 64-bit IEEE floating-point number
float -> 32-bit IEEE floating-point number
int Integer -> size is system dependent (MIDL treats int as a 32-bit signed integer on 32-bit systems)
long -> 32-bit signed integer
short -> 16-bit signed integer
BSTR -> Length-prefixed string
CY -> 8-byte fixed-point number (formerly CURRENCY)
DATE -> 64-bit floating-point fractional number indicating number of days since December 31, 1899
SCODE -> Built-in error type that corresponds to HRESULT
enum -> Signed integer size is system dependent
IDispatch* -> Pointer to IDispatch interface (VT_DISPATCH)
IUnknown* -> Pointer to an interface that is not derived from IDispatch (VT_UNKNOWN) any interface can be represented by its Iunknown interface)
SAFEARRAY (TypeName) -> Array of TypeName that can be any of the above types
TypeName* -> Pointer to TypeName that can be any of the above types
Joao Vaz
|
|
|
|
|
Thanks for the list Joao, then I have to forget about HGlobal ?, I thought HGlobal could be used by any application, in any place...
It seems that the things are getting harder... I tried to use an Exe server that could hold the ActiveX, but then Word doesn´t like it and says me that he didn´t found the control :´-(...
I tried to Marshal the "IPicture" interface as well, and no success...
The streams things on global memory didn´t work as well...
And the proxy/stub dll, not as well ( maybe is because my app has a proxy to access word and Word takes directly the dll).
Only left to try to paste it in the clipboard and get it from there ( Hey ! Microsoft makes it really cool !.... ).
AAAAH ! Someday I will 100 %crazy (now I´m 99 %)
|
|
|
|
|
How are you automating ?
Hwre it goes a snippet of code of a sample app that automates word:
// Office.h
#define Uses_MSO2000
#pragma warning(disable:4146)
#ifdef Uses_MSO2000
// for MS Office 2000
#import "D:\Program Files\Microsoft Office\Office\MSO9.DLL"
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "D:\Program Files\Microsoft Office\Office\MSWORD9.OLB" \
rename("ExitWindows","_ExitWindows")
#import "D:\Program Files\Microsoft Office\Office\EXCEL9.OLB" \
rename("DialogBox","_DialogBox") \
rename("RGB","_RGB") \
exclude("IFont","IPicture")
//#import "D:\Program Files\Common Files\Microsoft Shared\DAO\DAO360.DLL" \
// rename("EOF","EndOfFile") rename("BOF","BegOfFile")
//#import "D:\Program Files\Microsoft Office\Office\MSACC9.OLB"
#else
// for MS Office 97
#import "D:\Program Files\Microsoft Office\Office\MSO97.DLL"
#import "D:\Program Files\Common Files\Microsoft Shared\VBA\VBEEXT1.OLB"
#import "D:\Program Files\Microsoft Office\Office\MSWORD8.OLB" \
rename("ExitWindows","_ExitWindows")
#import "D:\Program Files\Microsoft Office\Office\EXCEL8.OLB" \
rename("DialogBox","_DialogBox") \
rename("RGB","_RGB") \
exclude("IFont","IPicture")
//#import "D:\Program Files\Common Files\Microsoft Shared\DAO\DAO350.DLL" \
// rename("EOF","EndOfFile") rename("BOF","BegOfFile")
//#import "D:\Program Files\Microsoft Office\Office\MSACC8.OLB"
#endif
#pragma warning(default:4146)
-----------------------------------------------------------------------------
// test.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include "Office.h"
void main()
{
::CoInitialize(NULL);
try {
using namespace Word;
_ApplicationPtr word;
word.GetActiveObject(L"Word.Application");
if (word == 0) {
word.CreateInstance(L"Word.Application");
word->Documents->Open(&_variant_t("c:\\myfile.doc"));
}
word->Visible = true;
word->Activate();
_DocumentPtr doc = word->ActiveDocument;
Word::HeaderFooterPtr foot =
doc->Sections->Item(1)->Footers->Item(wdHeaderFooterPrimary);
foot->Range->Text = "My program";
} catch (_com_error& er) {
char buf[1024];
sprintf(buf,"_com_error:\n"
"Error : %08lX\n"
"ErrorMessage: %s\n"
"Description : %s\n"
"Source : %s\n",
er.Error(),
(LPCTSTR)_bstr_t(er.ErrorMessage()),
(LPCTSTR)_bstr_t(er.Description()),
(LPCTSTR)_bstr_t(er.Source()));
printf(buf);
}
::CoUninitialize();
Hope this helps ??????????
Joao Vaz
|
|
|
|
|
the missing include is #include <stdio.h>
Joao Vaz
|
|
|
|
|
Other basic question,Have your sure that your CreateInstance is something like this :
HRESULT hr=CoCreateInstance(CLSID_Something, CLSCTX_SERVER, NULL, IID_IDataObject, (void *)&m_pIDataObjImage);
It seems that your idataobject pointer is illegal ? you checked the value ?
Joao Vaz
|
|
|
|
|
Hi,
The bad thing is that to add the ActiveX to word I have to create it calling the automation method:
m_pWord->GetSelection()->InlineShapes->AddOLEControl(vClassType);
But I will try that in a dummy program and see if it returns the right pointer.
Braulio
|
|
|
|
|