|
Hi Gita,
My first question is why do you use the ROT for component registering? Usually you do this only if you are writing your own moniker class.
I can't say anything about the IProxyManager interface, but if the IMarshal interface was queried it means that somebody wants to create a proxy for your object.
Regards,
Alex Gorev,
Dundas Software.
|
|
|
|
|
Hello Alex,
I am not writing my own moniker class but i am using
monikers.
I need to access my component from another process. I
use the component to exchange data between an ActiveX
component and an application.
So i register it with ROT using an ItemMoniker created with the ClassId. And then i get an itf pointer to the same object from my application.
Initially i tried by registering the OCX itself with ROT and it worked fine. I could even invoke the methods.
But the problem was revoking it from the ROT. I aint in a position to decide when the use of OCX is over. So i decided to have another component between the ocx and appln.
I am new to this. So its trial and error. I found use of Monikers and ROT the simplest. Is there a better way to do it?
I have one more question. I finally managed to register the object with the ROT (i tried with the ROT method Register and well as RegisterActiveObject) but when i try to get
an itf pointer to it , in my application, it simply deletes the entry from ROT!!
I am unable to pinpoint where i am going wrong.
Any suggestions?
-Gita
|
|
|
|
|
Hi,
If you want to keep the object in the ROT till it's registration is explicitly revoked you can use the "strong" registartion by specifying ROTFLAGS_REGISTRATIONKEEPSALIVE flag in the IRunningObjectTable::Register method.
Regards,
Alex Gorev,
Dundas Software.
|
|
|
|
|
Hi Alex,
The trouble is that it gets deleted despite me using the
ROTFLAGS_REGISTRATIONKEEPSALIVE flag!
-Gita
|
|
|
|
|
Hi!
??? Concerning MSDN it MUST stay there till you call Revoke method.... ??? I have no idea what's going on...
Alex Gorev,
Dundas Software.
|
|
|
|
|
I want to play two movies at the same time side-by-side, one using MCIWnd and the other one using CMediaPlayer (Windows Media Player ActiveX Control).
The following code does it, except that I have a background image that should appear on top of the two controls.
My question: why the bitmap doesn't appear on top of the CMediaPlayer control (while the bmp appears on top of the MCIWnd control!) ?
I thought ::SetWindowPos( ... , HWND_BOTTOM, ...) will place the control at the bottom of all other control?
void CMyDlg::OnButton1() {
HWND hMCI;
hMCI = MCIWndCreate(m_hWnd,AfxGetApp()->m_hInstance, MCIWNDF_SHOWNAME|MCIWNDF_NOMENU, "C:\\1.avi");
::SetWindowPos(hMCI, HWND_BOTTOM, 10,10,200,200, SWP_SHOWWINDOW);
MCIWndPlay(hMCI);
// CMediaPlayer2 is a class from Windows Media
// Player ActiveX control
CMediaPlayer2 m_media;
m_media.Create( "Media", WS_VISIBLE, CRect(250, 10, 550, 260), this, 1234);
::SetWindowPos(m_media.m_hWnd, HWND_BOTTOM, 250, 10, 200, 200, SWP_SHOWWINDOW);
m_media.SetFileName("C:\\2.avi");
m_media.Play();}
If anyone can explain this to me, I really appreciate it. Thanks for any help in advance.
|
|
|
|
|
Is there any way to use some of the simple MFC
data types and collections like CString,
CTime, CUIntArray, etc. inside ATL methods?
The compiler keeps barking at me when I
include afx.h:
#error WINDOWS.H already included. MFC apps must not #include <windows.h>
I've tried few things without luck.
I'm pretty much resigned to writing a class
to isolate ATL from the MFC stuff.
I have some old code that uses these things pretty
heavily and I would like to incorporate this code
without a major rewrite.
|
|
|
|
|
If you have an ATL dll project you only need to check "Support MFC" in the first page of the wizard. If you are building a ATL exe project a little more work is involved. This info can be found in KB article Q173974 located at:
http://support.microsoft.com/support/kb/articles/Q173/9/74.ASP?LN=EN-US&SD=msdn&FR=0
You should also consider linking to MFC statically if you are only using simple data types.
|
|
|
|
|
Hi,
I think the best thing to do is to use Windows Template Library instead of MFC classes. WTL is a set of classes that extend ATL to support more complex user interfaces for either applications or various UI components, while maintaining the big advantage of ATL - small and fast code.
It doesn't have all the data types you need but it has CString, CRect, CPoint, CSize and lot's of other useful things. So if the size of the code and performance are important to you - go with WTL.
WTL is a part of Platform SDK and you can download it from http://www.microsoft.com/msdownload/platformsdk/setuplauncher.htm.
Regards,
Alex Gorev,
Dundas Software.
|
|
|
|
|
Hi!
You have to send (submit) the data to the server using the HTTP POST and format it according to RFC 1867. This document describes the file uploading data format. It's not complicated and I don't think you will have any problems implementing it.
You can find this RFC at http://www.rfc-editor.org/rfc/rfc1867.txt.
Regards,
Alex Gorev,
Dundas Software
--- Original Message ---
> Who Can tell me How to use Visual C++ Writing a
> Appliccation Program that can simulate IE Runing home
> page as follows
>
>
>
>
> .
> .
> .
>
|
|
|
|
|
Thanks you for your Suggest!
But I think I need a sample code that Visual c++,
Because it is more helpful for me!
|
|
|
|
|
Unfortunately I don't have any source code examples and I have no idea where you can get them.
Alex.
|
|
|
|
|
Who Can tell me How to use Visual C++ Writing a Appliccation Program that can simulate IE Runing home page as follows
.
.
.
|
|
|
|
|
Hi,
How do I display the same Property Sheet that is shown when we select 'Properties' from the context menu on a file or directory in Windows Explorer. I want to display the properties of a file when I select 'Properties' from the context menu on Background , but do not want to create a dialog template of my own and populate the dialog with all the information. I want to reuse the resource that Explorer uses and I use IShellExtInit,IContextMenu and IShellPropSheetExt in the same time.
Thanks in advance,
Maria
|
|
|
|
|
Have you tried using ShellExecute with the "properties" and the file you want information about?
Example:
ShellExecute(hMyWindowNotExplorer, "properties", "c:\\winnt", "", "", SW_NORMAL);
Hope this helps.
-Erik
|
|
|
|
|
Hi.
I had tried using LBS_OWNERDRAWFIXED function when I create a new window for LISTBOX. I can received the WM_DRAWITEM message and changed the text with background color then send text to display (I used 'TextOut' function.) as far, the work is find , there will be able display which one message with color I want to display on listbox window, but when next message "WM_PAINT" will clear all, let the window blank. can you tell me what's wrong I got??
If possible that I can got the Listbox item HDC directly without using LBS_OWNERDRAWFIXED?? If can then how about the EditBox HDC??
Thanks for you helps.
Jason.
|
|
|
|
|
The WM_CTLCOLORLISTBOX message is sent to the parent window of a list box before the system draws the list box. WM_CTCOLOREDIT too. By responding to this message, the parent window can set the text and background colors of the list box by using the given display device context handle.
WM_CTLCOLORLISTBOX
hdcLB = (HDC) wParam;// handle to list box display context
hwndLB = (HWND) lParam; // handle to list box
This is for 32 bit only for 16 you have just WM_CTLCOLOR and then need to switch on the WPARAM
|
|
|
|
|
Hi,
I still unable to figure out the process of registration of my components via Browser. Can you give me the more details how can do this?? May be little bit example.
|
|
|
|
|
Hi!
You have to package your component and the best way to do this is to use the CAB files. In the .INF file of the package you will be able to specify which controls the browser should register. All this information is IE related I'm not sure how it will work in Netscape Navigator.
See more details in the MSDN article "Packaging ActiveX Controls".
Regards,
Alex Gorev,
Dundas Software.
|
|
|
|
|
I would like to use the function IDataInitialize::LoadStringFromStorage that takes LPCOLESTR as parameters. The first parameters is a udl file and I have that file in a char*. How to past from my char* to the LPCOLESTR? The second parameter is a LPCOLESTR* how can I get that back to char*?
Thanks.
|
|
|
|
|
Hi!
You can use the A2OLE macro to convert the char* string to LPCOLESTR. To get the string back you have to specify the valid pointer to LPCOLESTR and then you can convert the result Unicode string to char*. I don't know who is responsible for allocating memory for the result, so if you have to do that you can create an array of WCHARs.
You can find more information about the "String Conversion Macro" in the MSDN.
Regards,
Alex Gorev,
Dundas Software.
|
|
|
|
|
Hi,
Use AnsiToUnicode( )
&
UnicodeToAnsi()
here are two examples
OPENFILENAME ofn;
LPOLESTR pszFileNameW;
LPMONIKER pmk;
..
......
// Get file name from OpenFile Common Dialog. The ANSI file name will
// be placed in ofn.lpstrFile
GetOpenFileName(&ofn);
..
......
AnsiToUnicode(ofn.lpstrFile, &pszFileNameW);
CreateFileMoniker(pszFileNameW, &pmk);
CoTaskMemFree(pszFileNameW);
..
......
COleInPlaceFrame::SetStatusText(LPCOLESTR pszStatusTextW)
{
LPSTR pszStatusTextA;
UnicodeToAnsi(pszStatusTextW, &pszStatusTextA);
SetWindowText(m_hwndStatus, pszStatusTextA);
CoTaskMemFree(pszStatusTextA);
}
See Also OLE2CT()
Hope That will help
Ghazi
|
|
|
|
|
I'm creating simple WMFs (Aldus and non-Aldus) by doing a simple StretchDIBits with a DIB i've created myself. i know the DIB is valid because a) if i draw it to the screen, it looks fine, and b) the code works on NT, Win2K and, i think, 95.
when i create these metafiles in Win98, however, the image is shifted to the right 20 (i haven't measured) pixels or so - what should be the left edge of the image appears about 20 pixels from the displayed left edge, and, the colors are wrong on the part of the image to the right of the real left edge (the components are swapped, apparently).
it sounds like the DIB is wrong, but i know it's not.
also, i've tried doing this with an HBITMAP and BitBlt, with the same results.
more info....
if i open these WMFs in PSP 6, they look fine. if i view them with ACDSee or the Win98 Explorer, they have the offset problem.
if i read it into PSP6, then resave, the new WMF looks fine in ACDSee, Win98's Explorer and PSP.
i'm stumped.
are there tricks to saving WMFs that aren't documented?????
any info is appreciated.
-c
// use the screen DC
HDC dc = ::GetDC(NULL);
if (dc!=NULL)
{
// calculate output rect....
....
HDC hMetaDC = ::CreateEnhMetaFile(dc, NULL, &rect, "");
if (hMetaDC!=NULL)
{
// map mode junk
SetMapMode(hMetaDC, MM_ANISOTROPIC);
SetWindowExtEx(hMetaDC, iDPIX, iDPIY, NULL);
SetViewportExtEx(hMetaDC, iDPIX, iDPIY, NULL);
BITMAPINFO bmInfo = *(LPBITMAPINFO)pDIB ;
// this function uses generic 24bit DIBs, only. i know this
// because i generate them myself.
LPVOID lpDIBBits = (LPVOID)(pDIB + bmInfo.bmiHeader.biSize);
UINT32 lines = ::StretchDIBits(hMetaDC,
0,0,
width, height,
0,0,
width, height,
lpDIBBits,
&bmInfo,
DIB_RGB_COLORS,
SRCCOPY);
HENHMETAFILE hMeta = ::CloseEnhMetaFile(hMetaDC);
// How big will the metafile bits be?
UINT32 dwSize = GetWinMetaFileBits( hMeta, 0, NULL,
MM_ANISOTROPIC, dc );
if (dwSize!=0)
{
// Allocate that much memory
ISByteArray bitBuf(dwSize);
BYTE *pBits = (BYTE *)bitBuf;
// Let windows convert the enhanced metafile to a 16
windows metafile
GetWinMetaFileBits( hMeta, dwSize, pBits, MM_ANISOTROPIC,
dc );
// Write the metafile bits
io.WriteBuf(pBits, dwSize);
}
::DeleteEnhMetaFile(hMeta);
}
::ReleaseDC(NULL, dc);
}
|
|
|
|
|
Chris,
Had the same problem. It's a memory alignment thing. (prints fine on NT but had a problem on 95/98)
Sorry to mail a bulk of code like this.
Cheers,
GBO.
---
// Try something like this:
// excerpt from my GO++ extension code.
// I do not load the MetaFile from file, but from memory
// (it is embedded in my DLLs)
BOOL CGoSchemeMetaPict::DrawObject(CDC* pDC)
//:draw this metafile
{
if (!CGoObject::IsVisible()) return TRUE;
// allow for the MetaFileName() function to be overriden and actually
// change the name behind our backs!
if (myResID == 0)
{
TRACE0("CGoMetaFile with no ResourceID\n");
CGoObject::DrawObject(pDC); // call the base class default draw
return TRUE;
}
CGoAppMixIn* theApp = (CGoAppMixIn*) AfxGetApp();
CGoView* pView;
if (m_pDocument) pView = m_pDocument->GetCurrentDrawView();
else pView = m_pView;
int nScale = 100;
if (pView) nScale = pView->GetScale();
// only use the bitmap cache if the scale factor is 1:1 or smaller. If we are
// scaling things larger, draw the metafile directly.
CRect devRect = GetBoundingRect();
/* if (bPrintPreview)
{
CDC* pATC = CDC::FromHandle(pDC->m_hAttribDC);
pATC->LPtoDP(&devRect);
}
else
{
pDC->LPtoDP(&devRect);
}
*/ //GBO: does not work now ??
// for Win32 functions
HDC hDCDrawSurf = pDC->GetSafeHdc( );
LPENHMETAHEADER pemh;
if (hEnhMetaFile == NULL)
{
HRSRC HResourceInfo =
::FindResource( HCallingModule, // module handle
MAKEINTRESOURCE(myResID), // pointer to resource name
(LPCSTR) "WMFRES" // pointer to resource type
);
if (HResourceInfo == NULL)
{
DWORD error = ::GetLastError();
_ASSERT(NULL);
AfxMessageBox("HResourceInfo == NULL for MetaFileResource!");
return FALSE;
}
HGLOBAL HData = LoadResource( HCallingModule, // resource-module handle
HResourceInfo // resource handle
);
if (HData == NULL)
{
DWORD error = ::GetLastError();
_ASSERT(NULL);
AfxMessageBox("HData == NULL for MetaFileResource!");
return FALSE;
}
void* pMapFile = HData;
pemh = (LPENHMETAHEADER) HData;
DWORD uiSize = 0;
// CHECK FOR WMF FORMAT
//
// If it has an ALDUS header skip it
// Notice: APMSIZE is used because the HANDLE and RECT of the structure
// depends on the environment
//
if (*((LPDWORD)pemh) == ALDUS_ID)
{
ALDUSMFHEADER *pAldusMFHeader;
METAHEADER *pMFHeader; // Set pointers on the resource bloc
pAldusMFHeader=(ALDUSMFHEADER *) HData; // Points to the beginning of ALDUS METAHEADER
pMFHeader=(METAHEADER *)(pAldusMFHeader+1); // Points to the beginning of METAHEADER
// the Pointer + 1 -> 4 bytes further
// these 4 bytes == ALDUS_ID
// Keeps a copy of the ALDUSMETAHEADER
memcpy(&m_AldusMFHeader,pAldusMFHeader,sizeof(ALDUSMFHEADER));
_ASSERT(pMFHeader->mtType == 1); // in memory!
hEnhMetaFile = ::SetWinMetaFileBits(
pMFHeader->mtSize * 2L, // was 2?
// is size in WORDS
// Unsigned word (= 16 bits or 2 bytes).
(const unsigned char*)pMFHeader,//m_pMFBits,
NULL, //hDCDrawSurf, // was NULL
NULL);
if (hEnhMetaFile == NULL)
{
DWORD error = ::GetLastError();
_ASSERT(NULL);
CString errorrep(_T(""));
char temp[48];
::ZeroMemory(temp, 48);
_itoa(error, temp, 10);
errorrep = CString("UNSUPPORTED FORMAT or SEVERE ERROR for MetaFileResource! Error = ");
errorrep += CString(temp);
errorrep += CString("\nuiSize*2L = ");
_itoa(uiSize*2L, temp, 10);
errorrep += CString(temp);
errorrep += CString("\nhDCDrawSurf = ");
_itoa( (__int32) hDCDrawSurf, temp, 10);
errorrep += CString(temp);
AfxMessageBox(errorrep);
// UNSUPPORTED FORMAT
return FALSE;
}
}
else
{
// CHECK FOR EMF FORMAT
uiSize = pemh->nBytes;
hEnhMetaFile = ::SetEnhMetaFileBits (
uiSize, // buffer size
(PBYTE)pMapFile+pemh->offDescription+pemh->nDescription // buffer that contains enhanced metafile data
);
if (hEnhMetaFile == NULL)
{
DWORD error = ::GetLastError();
_ASSERT(NULL);
char temp[48];
::ZeroMemory(temp, 48);
_itoa(error, temp, 10);
CString errorrep("UNSUPPORTED FORMAT or SEVERE ERROR for MetaFileResource! Error = ");
errorrep += CString(temp);
AfxMessageBox(errorrep);
// UNSUPPORTED FORMAT
return FALSE;
}
}
}
int saved = pDC->SaveDC();
// TODO: add draw code for native data here
if (hEnhMetaFile != NULL)
{
BOOL Answer = ::PlayEnhMetaFile(hDCDrawSurf, hEnhMetaFile, &devRect );
if (Answer != TRUE)
{
DWORD error = ::GetLastError();
_ASSERT(NULL);
AfxMessageBox("PlayEnhMetaFile Failed for MetaFileResource!");
}
}
else
{
_ASSERT(NULL);
AfxMessageBox("hEnhMetaFile == NULL && hMetaFile == NULL for MetaFileResource!");
}
pDC->RestoreDC(saved); // reset DC
return TRUE;
}
|
|
|
|
|
I have a foxpro component that take two VARIANT* as parameters. How do I populate these two parameters and
call IDispatch::....?
|
|
|
|
|