|
Just wait...
I'm beginning to understand.
When you write myDisp, you mean an object of type IDispatch.
So in my case i declare CComPtr<IAcadObject> myDisp;
When you write myAttrib, you mean an object of type IAcadAttributeReference.
So i declare CComQIPtr<IAcadAttributeReference ,&__uuidof(IAcadAttributeReference)> myAttrib;
I will try that immediately ...
(my previous post was also corrupted by the remove of <> !)
|
|
|
|
|
IT WORKED !!!
long i = 0;
CComPtr<IAcadObject> myDispatch;
CComQIPtr<IAcadAttributeReference ,&__uuidof(IAcadAttributeReference)> myAttrib;
try
{
result = SafeArrayGetElement(arrayAttrib.parray, &i, &myDispatch);
myAttrib = myDispatch;
if (result == S_OK)
{
double dist = myAttrib->GetHeight();
Wonderful support, thanks you very much, and now let's get some work done please
|
|
|
|
|
|
I have impelemented the following code:
STDMETHODIMP CCSerialno::MachineID()
{
// TODO: Add your implementation code here
char bufVolumeLabel[255] ="";
DWORD Size=255;
DWORD SerialNo;
long Slnum=0;
DWORD MCL;
DWORD Flags;
char bufFileSystem[255] ="";
for (int iCounter=0;iCounter
|
|
|
|
|
In your C++ code,
<br />
STDMETHODIMP CCSerialno::MachineID(long *machineID)<br />
{<br />
...<br />
*machineID = ...;<br />
...<br />
}<br />
In your IDL interface,
HRESULT MachineID([out,retval]long *machineID);
RSS feed
|
|
|
|
|
What the method returns is an HRESULT, which simply reveals success or failure.
Your IDL (or ODL) for the method needs to be
HRESULT MachineID([out,retval]long *pSerialNo)
and you need to modify the C++ declaration and code
STDMETHODIMP CCSerialno::MachineID(long* pRes)
{
// TODO: Add your implementation code here
TCHAR bufVolumeLabel[255] = _T("");
DWORD Size=255;
DWORD SerialNo;
long Slnum=0;
DWORD MCL;
DWORD Flags;
TCHAR bufFileSystem[255] =_T("");
for (int iCounter=0;iCounter < 26; i++)
{
if (GetDriveType((LPCTSTR)(HardDiskLetters[iCounter]))==DRIVE_FIXED)
if (GetVolumeInformation((LPCTSTR)(HardDiskLetters[iCounter]),
(LPTSTR)(bufVolumeLabel),Size,&SerialNo,&MCL,&Flags,(LPTSTR)(bufFileSystem),Size))
{
Slnum=Slnum+SerialNo;
}
}
if (pRes!=NULL)
{
*pRes = Slnum;
return S_OK;
}
return E_INVALIDARG;
}
Steve S
|
|
|
|
|
|
We aim to please!
Steve S
|
|
|
|
|
I am trying to implement tree control context menus and their not working very well. When right-clicking on an item, the item is not selected, making the context menu very useless. The tree control is in a dialog bar. What could be the problem?
-- Steve
|
|
|
|
|
You're getting either NM_RCLICK or WM_CONTEXTMENU too soon, not that you can do anything about that. What I've done in similar situations is to use PostMessage to send a private message that tells me to pop up a context menu. By the time I receive this, the select operation has completed. Alternatively, you have to get the coords of the mouse at the time of the original message and hit test the items yourself, then update the selection state.
Sounds trickier than it is, really...
Steve S
[This signature space available for rent]
|
|
|
|
|
My application needs to run 2 powerpoint presentations in a "kiosk" manner. One is a screensaver, that is shown until the user moves the mouse, when the application should automatically display the interactive application.
The app is able to show the presentations, but how can I get some kind of mousemove event from Powerpoint so that I can change the presentation being shown?
Thanks in advance.
G. Raven
|
|
|
|
|
I'm actually trying to solve a similar problem myself. In my case, what I'd like to do is to be able to detect mouse clicks on elements in a running PowerPoint presentation, or at least clicks in the PowerPoint window. Can anyone give me some suggestions on how to do this, or let me know if it's even possible?
|
|
|
|
|
Hello all,
I am currently writing a COM plug-in for Outlook that gets all AppointmentItem data utilizing Invoke and calling methods such as GetSubject and GetAddress. However, I need to get the recurrence pattern of the AppointmentItem and I am unsure how to setup the Invoke call to get this to work. Also, I don't know the return value. Unfortunately, MSDN only shows how to do this using a typelib, and I have been unable to find anything on the web on how to do a straight COM call. Does anyone have any idea on how to get the recurrence for a particular AppointmentItem?
Brigg Thorp
Software Engineer
Timex Corporation
|
|
|
|
|
I implemented the following code using ATL COM and implemented the method MachineID.
I have declared MAX_OF_HARD_DISKS and HardDiskLetters[] as follows
#define MAX_OF_HARD_DISKS 24
static char HardDiskLetters[MAX_OF_HARD_DISKS][4]={
"c:\\", "d:\\", "e:\\", "f:\\", "g:\\", "h:\\",
"i:\\", "j:\\", "k:\\", "l:\\", "m:\\", "n:\\",
"o:\\", "p:\\", "q:\\", "r:\\", "s:\\", "t:\\",
"u:\\", "v:\\", "w:\\", "x:\\", "y:\\", "z:\\"
};
STDMETHODIMP CSerialno::MachineID()
{
// TODO: Add your implementation code here
ULARGE_INTEGER AvailableToCaller, Disk, Free;
for (int iCounter=0;iCounter
|
|
|
|
|
adsilva wrote:
I get error at code GetDiskFreeSpaceEx as "cannot convert parameter 1 from char[4] to const unsigned short* "
static TCHAR HardDiskLetters[][MAX_OF_HARD_DISKS]={
"c:\\", "d:\\", "e:\\", "f:\\", "g:\\", "h:\\",
"i:\\", "j:\\", "k:\\", "l:\\", "m:\\", "n:\\",
"o:\\", "p:\\", "q:\\", "r:\\", "s:\\", "t:\\",
"u:\\", "v:\\", "w:\\", "x:\\", "y:\\", "z:\\"
};
RSS feed
|
|
|
|
|
Thanks a lot!!
But now I am getting 25 errors after changing char to TCHAR. Do I need to add any header file to get rid of the errors.
The error is as follows
error C2440: 'initializing' : cannot convert from 'char [4]' to 'unsigned short'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Thanks
Anna
|
|
|
|
|
I didn't only change char to TCHAR. I have also changed the order in [][] dimensions.
The overall code compiles and runs fine on my machine (vc++6.0).
RSS feed
|
|
|
|
|
Sorry!! Still I just can't get rid of the errors!!
D:\Backup Codes\Crypts\Serialno.cpp(18) : error C2440: 'initializing' : cannot convert from 'char [4]' to 'unsigned short'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Note: I have used this code in ATL COM .
Thanks ,
Anna.
|
|
|
|
|
adsilva wrote:
D:\Backup Codes\Crypts\Serialno.cpp(18) : error C2440: 'initializing' : cannot convert from 'char [4]' to 'unsigned short'
There's something odd anyway. The error should be "cannot convert from 'char [4]' to 'unsigned short*" (note the *) since GetDiskDriveSpaceEx takes a LPCTSTR as first parameter. LPCTSTR is unsigned short* if you compile with UNICODE, and is unsigned char* if not.
RSS feed
|
|
|
|
|
Earlier I was getting the following error when I was declaring harddiskletters as
static char HardDiskLetters[MAX_OF_HARD_DISKS][4]={
"c:\\", "d:\\", "e:\\", "f:\\", "g:\\", "h:\\",
"i:\\", "j:\\", "k:\\", "l:\\", "m:\\", "n:\\",
"o:\\", "p:\\", "q:\\", "r:\\", "s:\\", "t:\\",
"u:\\", "v:\\", "w:\\", "x:\\", "y:\\", "z:\\"
};
D:\Backup Codes\Crypts\Serialno.cpp(52) : error C2664: 'GetVolumeInformationW' : cannot convert parameter 1 from 'char [4]' to 'const unsigned short *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
After changing to
static TCHAR HardDiskLetters[][MAX_OF_HARD_DISKS]={
"c:\\", "d:\\", "e:\\", "f:\\", "g:\\", "h:\\",
"i:\\", "j:\\", "k:\\", "l:\\", "m:\\", "n:\\",
"o:\\", "p:\\", "q:\\", "r:\\", "s:\\", "t:\\",
"u:\\", "v:\\", "w:\\", "x:\\", "y:\\", "z:\\"
};
I am getting 25 errors which points to the line where the above declaration is made.
the error reads as follows
D:\Backup Codes\Crypts\Serialno.cpp(18) : error C2440: 'initializing' : cannot convert from 'char [4]' to 'unsigned short'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Thanks,
Anna.
|
|
|
|
|
If you rollback to what you had before you could explicitely cast
HardDiskLetters[i]
to :
(LPCTSTR)(HardDiskLetters[i])
I believe the compiler would be ok then. Quite honestly, I didn't suggest this solution first because explicit cast at this point is bad code.
If you are willing to keep the code I suggest, just send it to me so I can test it (make a zip, and forward it by clicking on the [Email] link below).
RSS feed
|
|
|
|
|
Thanks a lot!!
Its working now . I explicitly type casted HARDDISKLETTERS as you mentioned.
I have a query. I want to assign a varaible declared as DWORD to a string .
For eg;
DWORD harddiskspace ;
I get some value in harddiskspace . I want to retrieve as a string .
Thanks ,
Anna.
|
|
|
|
|
#include <stdio.h>
char szTmp[32];
DWORD harddiskspace = ...;
sprintf(szTmp,"%ld",harddiskspace);
RSS feed
|
|
|
|
|
Don't do it that way! What you need to do is:
<br />
#define MAX_OF_HARD_DISKS 24<br />
static TCHAR HardDiskLetters[MAX_OF_HARD_DISKS][4]={<br />
_T("c:\\"), _T("d:\\"), _T("e:\\"), _T("f:\\"), _T("g:\\"), _T("h:\\"),<br />
_T("i:\\"), _T("j:\\"), _T("k:\\"), _T("l:\\"), _T("m:\\"), _T("n:\\"),<br />
_T("o:\\"), _T("p:\\"), _T("q:\\"), _T("r:\\"), _T("s:\\"), _T("t:\\"),<br />
_T("u:\\"), _T("v:\\"), _T("w:\\"), _T("x:\\"), _T("y:\\"), _T("z:\\")<br />
};<br />
This will compile as either an ANSI array of strings or a UNICODE array of strings. By casting, you would be passing an 8-bit string to a function that expects a 16-bit string. The function could not work with that. Also, note the order of the array subscripts. This should work - but I did not test it.
Good Luck,
Mike_V
|
|
|
|
|
How can I add a custom menu to Internet Explorer(i.e an extra menu to Internet Explorer like utilities to do certain task)
|
|
|
|
|