|
|
Hello,
I know that this may sound like a trival question, but I am trying to automatically generate the filter string for the lpstrFilter member of the OPENFILEDIALOG structure.
I look up the file extension in the registry and attempt to build the filter string by concatenating the string from the registry with the extension. I have not had much luck doing this. Perhaps is there an easier approach to this?
Thank you,
Andy Moore
|
|
|
|
|
Andy Moore wrote:
I look up the file extension in the registry and attempt to build the filter string by concatenating the string from the registry with the extension. I have not had much luck doing this.
Maybe it's just me but that does not tell me anything I can use to help.
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|
|
I guess basically what I am trying to do is if I have a file with a .zip extension, I want to call GetOpenFileName(&ofn) with the lpstrFilter set to filter only zip files, etc. I can look up HKCR/*.zip in the registry and get a string like "WinZip file". I am trying to generate the filter "WinZip Files (*.zip)\0*.zip\0".
I was wondering if there was already API functions that do this so I could avoid reinventing the wheel.
Thank you,
Andy Moore
|
|
|
|
|
nice idea.
Maybe AssocQueryStringByKey can help you, or IQueryAssociations.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
Thanks for the pointer. I will take a look at these.
Andy
|
|
|
|
|
Andy Moore wrote:
I am trying to generate the filter "WinZip Files (*.zip)\0*.zip\0".
Can you not just concatenate those two strings together using strcpy() /strcat() , or with a CString object if you are using MFC?
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
I am using ATL and wsprintf to try to build this string, but so far with no success. I will have to do some more debugging I guess.
Thanks,
Andy
|
|
|
|
|
what extension strings from the registry ? from HKEY_CLASSES_ROOT ? darn, all of them ?
This is something that needs to be done manually, it's too application dependent to automate from something like the registry ( IMHO ).
anyway, it's usually a one time thing.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
Hello,
I making an activex control in C++.
I need to create a property handler that will take in an enum:
enum Views {
aVIEW_DETAILS = LV_VIEW_DETAILS,
aVIEW_ICON = LV_VIEW_ICON,
aVIEW_LIST = LV_VIEW_LIST,
aVIEW_SMALLICON = LV_VIEW_SMALLICON,
aVIEW_TILE = LV_VIEW_TILE,
} ViewType;
ViewType CvbFileListCtrl::get_viewtype() {
}
void CvbFileListCtrl::set_viewtype(ViewType NewValue) {
}
Does anyone knows how to do this?
Please help!!!
iluha
|
|
|
|
|
Hi,
Does anyone know what is the way to change a CEdit's text color when the control is disabled?
I already implemented the reflected OnCtlColor, and it successfully changes the color when the control is enabled, but when disabled, the color becomes gray...
Thank you in advance.
"Needless redundancy is the hobgoblin of software engineering." - Peter Darnell
|
|
|
|
|
Vladimir Georgiev wrote:
...but when disabled, the color becomes gray...
This is normal (and expected) behavior. If you changed it to some other color, would the user know that the control was disabled, or would they try to interact with it and become frustrated when they couldn't?
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
I found a way to change the text color of a disabled CEdit.
1- You must derive a class from CEdit
2- Overwrite WindowProc and do the following:
LRESULT CMyEditBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_PAINT)
{
DWORD dwStyle = GetStyle();
if (dwStyle & WS_DISABLED)
{
EnableWindow(TRUE);
SetReadOnly(TRUE);
LRESULT res = CEdit::WindowProc(message, wParam, lParam);
SetRedraw(FALSE);
if ((dwStyle&ES_READONLY) == 0) SetReadOnly(FALSE);
EnableWindow(FALSE);
SetRedraw(TRUE);
CRect rcClient;
GetWindowRect(rcClient);
ScreenToClient(rcClient);
ValidateRect(rcClient);
return res;
}
}
return CEdit::WindowProc(message, wParam, lParam);
}
3- Overwrite CtlColor and change color when control is in read-only state (of course you can use a member variable instead of the read-only style to set disabled text color)
HBRUSH CMyEditBox::CtlColor(CDC* pDC, UINT nCtlColor)
{
if (GetStyle() & ES_READONLY)
{
pDC->SetBkColor(GetSysColor(COLOR_3DFACE));
pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));
return GetSysColorBrush(COLOR_3DFACE);
}
return NULL;
}
|
|
|
|
|
I have written a Windows "Service" that logs on using the "Local System" account and "Interact with Desktop" enabled. This Service is used to launch my application (via the CreateProcess API) when the computer is started. My application's data is stored on a shared network drive. The problem is "Local System" normally does not have access to network resources because it logs on with null creditials. This can be solved by adding the "shared resource" to the "NullSessionShares" registry key on the Server that owns the "shared resource".
This seems to work and my application is able to connect to the shared resource using the WNETAddConnection2 API. However, when my application tries to access a file on the shared resource (using the GetFileAttributes API), it returns an error code 5 (access denied). I checked the permission settings on the "Shared Drive" and "Everyone" has full access to this drive.
Any idea why I can't access this drive?
Thanks in advance,
Petrus
|
|
|
|
|
Maybe because the "Local System" can't be part of the any network group by definition let alone the "Everyone" group. What do you think?
What about creating an account for the service and give it the required permissions.
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|
|
I'm not sure. I was reading "Microsoft Knowledge Base Artice 122702", which describs how to access a shared resource from a "Service", and it did not mention anything about adding/modifying accounts.
Peter
|
|
|
|
|
Petrus Scott wrote:
and it did not mention anything about adding/modifying accounts.
Perhaps so but further researching finds article 124184 which says:
Do not use the system account. Services, such as Scheduler, and custom applications can be configured using user-specific accounts. User-specific accounts provide user level security based on a specific account and associated password.
http://support.microsoft.com/default.aspx?scid=kb;en-us;124184&sd=tech[^]
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|
|
Hello,
I am creating several modeless dialog boxes which have different style setups. The problem is CreateIndirect requires me to pass a handle to a LPCDLGTEMPLATE , which I don't really mind to create, but I was just wondering if it would be possible to access the pre-defined styles in the resources (just like MFC automatically does, when you create a modal dialog box) ?
Thank you very much for your time,
David
|
|
|
|
|
CDialog::Create() allows you to pass in the ID number of a dialog-box template resource. Is that what you are after?
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
How to receive outgoing message in MS Outlook, to read and change him if it is necessary.
If it is possible example without MFC please.
|
|
|
|
|
Is that like saying, "Instead of telling us what you don't want, please tell us what you do want?"
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
He wants to catch outgoing message:
Is need to add a little text to the end of the each outgoing message.
When user click "send messages". Before sending.... the plugin is need to add the little signature to the each of them.
|
|
|
|
|
There is a Code Project article that does pretty much the same thing, but monitors for incoming mail. You should read through it, and you can find it here. When done reading, it's time for copy & paste. Instead of using the interfaces mentioned in the article, you should select "_MailItem" and "ApplicationEvents". The first allows access to a mail item, and the second allows you to receive notifications when an event ItemSend is fired.
Then follow the article again. The event we are interested in is 0x0000f002 in hex code. The IDispatch interface pointer is the first parameter in the DISPPARAMS::rgvarg parameter list of the Invoke method. Although it's VARIANTARG pointer, I believe you can use reinterpret_cast to convert it into an IDispatch pointer. Then use this pointer to query for _MailItem interface and this new interface to manipulate the message if required.
If all this sounds too difficult or over your head, then go do something easier first.. Capturing events in Office applications is, suprise suprise, not one of the easiest things to do in VC++. It's MUCH easier in Visual Basic, but we don't use that here
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|
|
OK. I have this function:
STDMETHODIMP CAppEventListener::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* DispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) {
CMailItem MailItem;
MailItem.AttachDispatch( reinterpret_cast <idispatch*> (pDispParams->rgvarg->pdispVal) );
switch(dispIdMember)
{
case 0x0000f002:
{
AfxMessageBox( MailItem.get_Body() );
}
}
}
Please show me what I do incorrectly. I spent a couple hours with this and I don't know what to do.
|
|
|
|
|
Well, in order to get you going, here's a complete code-paste of a switch statement that catches an outgoing mail message and displays it in a message box:
const IID IID_IMailItem =
{0x00063034,0x0000,0x0000,{0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};<DIV>
.
.
.<DIV>
switch(dispIdMember)
{
case 0x0000f002:
{
IDispatch* pDisp = NULL;<DIV>
for ( UINT nIndex = 0; nIndex < pDispParams->cArgs; nIndex++ )
{
if ( pDispParams->rgvarg[nIndex].vt == VT_DISPATCH )
{
pDisp = pDispParams->rgvarg[1].pdispVal;
break;
}
}<DIV>
IUnknown* pMail;
HRESULT hr = pDisp->QueryInterface( IID_IMailItem, (void**)&pMail );<DIV>
if ( SUCCEEDED(hr) )
{
CMailItem MailItem;
MailItem.AttachDispatch( pDisp );<DIV>
CString csBody = MailItem.get_Body();<DIV>
AfxMessageBox( (LPCTSTR) csBody );
}<DIV>
pMail->Release(); pMail = NULL;<DIV>
break;
}
} I've tested this with my own Outlook XP (2002), and it captures outgoing mail messages correctly, and ignores other outgoing items. Copy the interface identifier to the start of the code file, and replace your switch statement with this code piece. Add a breakpoint, start Outlook, run the app in debug mode and observe the results. Although it works for me, it's not guaranteed to work for you out of the box, so be careful.
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|