|
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
|
|
|
|
|
Hi Joao !
The problem with all the picture stuff, was finally that my object used msxml as well,and I had a problem with the versions... ( DLL Hell with this MsXML), I remove the entries for the XML and it seems that it works fine... ( so the article that I wrote is still right )
Thanks Joao for all your help!
Braulio
|
|
|
|
|
Usted no tiene qué
(I hope this make sense )
Cheers,
Joao Vaz
|
|
|
|
|
hi,
i have some vc++ managed code and i cuse it from c#~, but there is some functions that takes a parameter by reference, the functions declarations shows like that
bool GetValorDouble (LONG lVarId, double &dValue)
when i try to use it in c# the function requires i pass a double* parameter.
now i see two possible solutions, but i have no solutions for none.
a) the way to pass parameter from c# (pass a double*)
b)modify the function in vc++, so i can pass in a simple way a double in c#.
I am with this problem a lot of days and i don't see nothing similar in the net.
Any Idea is welcome, thanks a lof in advance, and sorry my english.
|
|
|
|
|
Try putting the call in an unsafe block
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.
|
|
|
|
|
Hi,
I'm doing a web project which requires a way to send a huge number of emails to subscribers (like a mailinglist). and this point is very important : mails must be sure to be sent.
I now write a C++ app. on Windows 2000 server, use CDONTS component to send mail. this is very convenient, but i faced a problem : CDONTS relies on SMTP service of IIS, and in pretty poor internet connection, IIS's SMTP service seems stucked for pretty long and seems not reliable.
Do you have any better solutions ? many thanks
trieuhainguyen@pyramid-consulting.com
|
|
|
|
|
Ok I know how one function can write multiple lines with \r\n but I want multiple functions writing to one edit box with no previous data being overwritten. for example I have a dialogbox with two buttons and an edit box.
When the first button is clicked:
CString S1 = "William Jefferson";
CString S2 = "Bill Clinton";
m_Multilines.Format( "%s\r\n%s", S1, S2);
UpdateData(FALSE);
And when the second button is clicked I want to display another string underneath this one but I can never do it without erasing the previous data, can someone please help me to implement this correctly?
comimh
|
|
|
|
|
UpdateData(TRUE);
m_Multilines += "\r\nAnother line";
UpdateData(FALSE);
Tomasz Sowinski -- http://www.shooltz.com ** If you're going to rape, pillage and burn, be sure to do things in that order. **
|
|
|
|
|
Two UpdateData calls eh?
The purists will frown
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.
|
|
|
|
|
Nish [BusterBoy] wrote:
The purists will frown
I'm looking forward to it
Anyway, here's another version:
CString strx;
GetDlgItemText(IDC_EDIT1, strx):
strx += "\r\nAnother purist bites the dust";
SetDlgItemText(IDC_EDIT1, strx);
Tomasz Sowinski -- http://www.shooltz.com ** If you're going to rape, pillage and burn, be sure to do things in that order. **
|
|
|
|
|
Look up CEdit::SetSel
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.
|
|
|
|
|
How can i create fancy dialogs as that we can see in MSN messenger. In MSN messenger various dialogs consist of property tabs/sheets. But these are not of the style of standard win32 type tabs. Instead their structure is like fancy picture. How can i achieve this ????????
Farheen Shah
|
|
|
|
|
Do you meant the tabs for the Options?
According to SPY++, these are a standard windows control. It is possible that they have used some custom draw techinques. Have a look here http://www.codeproject.com/tabctrl/ for more info.
Michael
|
|
|
|
|
No, i didn't mean the "options dialog tabs" you mentioned !!!
The correct example is that of "send file or photo" dialog.
Farheen Shah
|
|
|
|
|
Okay, I see the ones you mean know.
This is a pretty simple trick. According to SPY++, these are button controls and not tabs. I'm guessing it's just an ownerdraw bitmap button with maybe use of the RGN GDI stuff to shape the button. I'm sure there must be an article on CodeProject which shows how to do this.
Clicking the buttons must just hide one set of controls and show the others.
Michael
|
|
|
|
|
Hi an need to spy on a text window that is displaying strings. Everytime this window displays new text i need to retrieve the new text and save it to a database in my app. I suppose i need to set up a hook to accomplish this?
I can get a handle to the window and when using Spy+ and when the window is displaying text the only message i can see is WM_PAINT..
How can i get the text beeing displayed in the window? Dont want all text in the window, just the latest string that was displayed.
|
|
|
|
|
This text window is in your process or in some other process?
Tomasz Sowinski -- http://www.shooltz.com ** If you're going to rape, pillage and burn, be sure to do things in that order. **
|
|
|
|
|
It's in a different process, a different application that i don't have the source to...
So im not sure it's possible to do what i want, but maybe i can do it with a hook?
|
|
|
|