|
I am trying to find the position in a midi file. The file is opened and playing and the time format is in milliseconds if that matters. The following code always returns false after the mciSendCommand. Why? What is going wrong?
MCI_STATUS_PARMS mci_status_params;
mci_status_params.dwItem = MCI_STATUS_POSITION;
if(mciSendCommand(myDeviceHandle, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&mci_status_params))
{
return false; // this always occurs
}
myPosition = mci_status_params.dwReturn;
return myPosition;
Can anyone help? Obviously I am using MCI.
|
|
|
|
|
Let me state the problem ANOTHER way:
Microsoft says that The IShellLink interface has an ANSI version (IShellLinkA) and a Unicode version (IShellLinkW). The version that will be used depends on whether you compile for ANSI or Unicode. However, Microsoft® Windows® 95 and Windows 98 only support IShellLinkA.
My question is this... Is there a way to compile a SINGLE CLASS that will work on BOTH Windows 98 and Windows 2000 to create Links depending on the platform?
For example, can you do something like:
if (b2000 || bNT)
{
// Use IShellLinkW
}
else {
// use IShellLinkA
}
Do you have to compile 2 separate programs to create links?
Bill SerGio, The Infomercial King
|
|
|
|
|
Two more thinks to check for are if it works in both NTFS and FAT.
Also NT5 /2000 uses shell link tracking, so check to see if a shortcut is moved that it still works.
Regardz
Colin J Davies
Sonork ID 100.9197:Colin
More about me
|
|
|
|
|
It seems that the more I test code and research this problem, that it is IMPOSSIBLE to write a single class and compile it to work for both Windows 98 and windows 2000.
The ONLY solution seems to be to create 2 versions of a DLL or an EXE, one for UNICODe and one for ASCII to create links.
Bill SerGio, The Infomercial King
|
|
|
|
|
There is no reason to build both a UNICODE and ASCII version. Just call the W and A routines directly based on the OS.
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
That is what I thought originally and it turns out NOT to work which surprised me.
the reason that it fails is that if you include a condition based on the operating system as follows:
if (b2000 || bNT)
{
// Use Unicode
}
else {
// Use ASCII
}
The reason it fails has to do with the fact that you can't get the code to compile on Windows 98.
Remember I am developing on Windows 98 and this is the problem.
For example, "SHGetSpecialFolderLocation()" works on Windows 98 but the call for the UNICODE function, "ShGetFolderPath()" FAILS to compile on a Windows 98 machine using Visual Studio UNLESS YOU COMPILE with unicode which renders the code useless on Windows 98
Bill SerGio, The Infomercial King
|
|
|
|
|
Bill SerGio wrote:
For example, "SHGetSpecialFolderLocation()" works on Windows 98 but the call for the UNICODE function, "ShGetFolderPath()" FAILS to compile on a Windows 98 machine using Visual Studio UNLESS YOU COMPILE with unicode which renders the code useless on Windows 98
You may have a problem with your VS installation. Or possibly need updated SDK header files, not sure. SHGetFolderPath() was introduced as a shortcut for the most common use of SHGetSpecialFolderLocation() , and requires that a separate DLL (SHFolder.dll) be installed. It does however work on both Win98 and Win2k should these criteria be met.
Or you can just use SHGetSpecialFolderLocation() and SHGetPathFromIDList() to accomplish (mostly) the same thing (but you'll have to do your own handling for CSIDL that are user-specific or not implemented on 98 (ex: CSIDL_PROGRAM_FILES_COMMON , CSIDL_COMMON_DOCUMENTS ).
--------
Have you hugged your monitor today? --Shog9 --
|
|
|
|
|
You dont need to do any test for OS just call
CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLinkW,
(void**) &pShellLink);
if it succeedes use the IShellLinkW interface.
If it fails create the IShellLinkA interface.
|
|
|
|
|
I am impressed! I must admit that I did not think of this as a switch instead of a switch based on the operating system.
i will write a demo program and post it and see if what happens--let you know in a little while.
By the way--this is a BRILLIANT suggestion to first try for IID_IShellLinkW and if it fails use IID_IShellLinkA.
And I might point out that in all the samples of code to create links, nobody has thought to do this!
Bill SerGio, The Infomercial King
|
|
|
|
|
I had a similar problem once - I had to call a Windows 2000 machine but I was developing on NT. The solution (in pseudocode) was something like this:
if(IsOs2000())
{
Explicitly load the system DLL that has the function
using LoadLibrary
Get the function poitner using GetProcAddress
Call the function
Unload the DLL if necessary
}
Just a thought. Ugly, I know, but it might work in your situation.
Even if you win the rat race, you're still a rat.
|
|
|
|
|
Am i missing something? Why doesn't IShellLinkA work on both '98 and 2k? They both work on XP AFAIK.
--------
Have you hugged your monitor today? --Shog9 --
|
|
|
|
|
Email me a release to test please Shog,
It might be Bill's 2000 has a problem.
Regardz
Colin J Davies
Sonork ID 100.9197:Colin
More about me
|
|
|
|
|
It ONLY works only Windows 98 and I was surprised to learn this as you are!
If you set _UNICODE, and compile it under UNICODE, as a SEPARATE exe or DLL then it works ONLY on Windows 98.
So far, nobody has created a class or piece of code that will compile and create a SINGLE exe or DLL that works on BOTH Windows 98 and Windows 2000.
Bill SerGio, The Infomercial King
|
|
|
|
|
Please excuse my type...
i meant...
If you set _UNICODE, and compile it under UNICODE, as a SEPARATE exe or DLL then it works ONLY on WINDOWS 2000.
Bill SerGio, The Infomercial King
|
|
|
|
|
I'm confused,
Shog9's app work on my Win 2000 and 98 for me.
Have you mangled your 2000 ?
Regardz
Colin J Davies
Sonork ID 100.9197:Colin
More about me
|
|
|
|
|
I have looked at every sample of source code i could find on creating Links on the Desktop and EVERY piece of sample code FAILS to create links on Windows 2000--except for those samples that include a separate UNICODE version of the code.
Now it is VERY inconvenient to have to include 2 versions of a program, one in ASCII and another in UNICODE. So what's the answer?
I will offer 2 solutions to this problem that I originally proposed in the "Lounge" where I was told was the wrong place to post anything important or serious!
The first solution is to create 2 versions of your code, and include BOTH versions as a resource in your application and launch the correction version from your program based on the Windows Platform. This works but is not elegant at all--it is the solution that i believe is used by BOTH InstallShield and WYSE Installers! No wonder their exe files are so big!
The other solution I offer below. I believe it will work if compiled on Windows 2000. And it would be nice if someone with Windows 2000 could let me know if it works?
I develop on Windows 98 using Visual Studio 6...
#include "direct.h" /* This is needed for _mkdir */
#include "objbase.h"
#include "shlguid.h"
#include "wchar.h"
#define INITGUID
#include "initguid.h"
//#define INC_OLE2
//#pragma comment( lib , "OLE2")
//#include "ole2.h"
//#include "comcat.h"
//#include "olectl.h"
Where UINT uLinkLoc = CSIDL_DESKTOP;
Is there a way to write a SINGLE class that can create a link on the Desktop in both Windows 98 and Windows 2000 without compiling 2 separate versions(one UNICODE and one ASCII)???
bool CInstall::CreateShortCut( LPCSTR lpszSourceFile,
LPCSTR lpszSourceDir,
UINT uLinkLoc,
LPCSTR lpszDesc,
bool IsFolder )
{
HRESULT hResult = NULL;
IShellLink* pShellLink = NULL;
bool rc = false;
LPCSTR lpszDestination = NULL;
ITEMIDLIST *id = NULL;
TCHAR szLinkLoc[MAX_PATH] = "";
TCHAR szShellPath[MAX_PATH] = "";
CString sLinkLoc;
sLinkLoc.Empty();
CString sLink;
sLink.Empty();
// Initialize IShellLink interface
hResult = CoInitialize(NULL);
// Get pointer to IShellLink Interface
hResult = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink,
(void**) &pShellLink);
if (SUCCEEDED(hResult))
{
//Cache, Fonts, History, NetHood, Personal, Printhood, Programs,
// Recent, SendTo, Start Menu, Startup, Templates, ShellNew
if (uLinkLoc == CSIDL_APPDATA) {
sLinkLoc = "AppData";
} else if (uLinkLoc == CSIDL_COOKIES) {
sLinkLoc = "Cookies";
} else if (uLinkLoc == CSIDL_DESKTOP) {
sLinkLoc = "Desktop";
} else if (uLinkLoc == CSIDL_STARTMENU) {
sLinkLoc = "Start Menu";
} else if (uLinkLoc == CSIDL_STARTUP) {
sLinkLoc = "Startup";
} else if (uLinkLoc == CSIDL_FAVORITES) {
sLinkLoc = "Favorites";
}
if (sLinkLoc.GetLength()>0) {
GetShellFolderPath(sLinkLoc, szShellPath);
sLink = szShellPath;
} else {
SHGetSpecialFolderLocation(NULL, uLinkLoc, &id);
SHGetPathFromIDList(id, szLinkLoc);
sLink = szLinkLoc;
}
sLink += "\\";
sLink += lpszDesc;
sLink += ".lnk";
lpszDestination = (LPCSTR)sLink;
if (IsFolder) {
// Requies: #Include
hResult = _mkdir(lpszDestination);
// Clean up
pShellLink->Release();
CoUninitialize();
if (SUCCEEDED(hResult)) { return true; } else { return false; }
}
IPersistFile* ppf = NULL;
// Set path to shortcut target
pShellLink->SetPath(lpszSourceFile);
// Add Start Directory
if(lpszSourceDir)
hResult = pShellLink->SetWorkingDirectory(lpszSourceDir);
// Add Description
if(lpszDesc)
hResult = pShellLink->SetDescription(lpszDesc);
//if(lpszArguments) { hResult = pShellLink->SetArguments(lpszArguments); }
//if (lpszIconLocation) { hResult = pShellLink->SetIconLocation(lpszIconLocation, nIconIndex); }
//if (Show != -1) { hResult = pShellLink->SetShowCmd(Show); }
//if (HotKey != 0) { hResult = pShellLink->SetHotkey(HotKey); }
//if(nIconIndex!=(UINT)-1) { hResult = pShellLink->SetIconLocation(lpszSourceFile,nIconIndex); }
// Query IShellLink for IPersistFile interface
// for saving shortcut in persistent storage
hResult = pShellLink->QueryInterface(IID_IPersistFile, (void**) &ppf);
if (SUCCEEDED(hResult)) {
WORD wszWideString[_MAX_PATH+1];
// Ensure that string is ANSI
//MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szLink,-1,wsz,sizeof(wsz));
MultiByteToWideChar(CP_ACP, 0, lpszDestination, -1, wszWideString, _MAX_PATH+1);
// Save link by calling IPersistFile::Save.
hResult = ppf->Save(wszWideString, TRUE);
ppf->Release();
rc = true;
SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_IDLIST, &pShellLink, 0);
}
// Clean up
pShellLink->Release();
CoUninitialize();
}
return rc;
}
Bill SerGio, The Infomercial King
|
|
|
|
|
I forgot to include one of the functions that I call in the code sample above and I am including it below.
bool CInstall::GetShellFolderPath(LPCSTR lpShellFolder, LPSTR lpShellPath)
{
//lpShellFolder can be one of the following
//AppData, Cache, Cookies, Desktop, Favorites, Fonts, History, NetHood,
//Personal, Printhood, Programs, Recent, SendTo, Start Menu, Startup,
//Templates, ShellNew
DWORD rc;
DWORD length = MAX_PATH;
DWORD type = REG_SZ;
HKEY hkey;
rc = RegOpenKeyEx(HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
0,
KEY_READ,
&hkey);
if (rc == ERROR_SUCCESS)
{
rc = RegQueryValueEx(hkey,
lpShellFolder,
NULL,
&type,
(BYTE *) lpShellPath,
&length);
RegCloseKey(hkey);
}
if (rc == ERROR_SUCCESS)
return true;
else
return false;
}
Bill SerGio, The Infomercial King
|
|
|
|
|
Have not tested, but if you say a UNICODE build will work
it is maybe because there are 2 IShellLink interfaces, one
IShellLinkA and one IShellLinkW, and if that happens to be
the case you could build an ANSI app and use IShellLinkW and get
it to work
|
|
|
|
|
So if this is the case, then:
if (b2000 || bNT) {
// Call "IShellLinkW"
}
else {
// Call "IShellLinkA"
}
Is this what you had in mind to build 2 versions in one class?
What I don't understand is why hasn't anyone posted a sample of this code before?
Bill SerGio, The Infomercial King
|
|
|
|
|
I was thinking, just query for IShellLinkW, if you get it, use it.
Otherwise use IShellLinkA.
|
|
|
|
|
Anyone know ehre to get some ASPI documentation?
Thanks in advance.
|
|
|
|
|
|
I was just wondering if there was a way to turn on and off the keyboard lights for CapsLock, NumLock and ScrollLock programmatically.
any help appreciated
"When a friend hurts us, we should write it down in the sand, where the winds of forgiveness get in charge of erasing it away, and when something great happens, we should engrave it in the stone of the memory of the heart, where no wind can erase it" Nish on life [methinks]
"It's The Soapbox; topics are optional" Shog 9
|
|
|
|
|
What! Brian Delahunty is asking a programming question
Look here. Clickety
I have never wasted time worrying about such insignificant things. Keep your eye upon the donut and NOT upon the hole. - Bill Sergio in The Lounge - June 23, 2002
|
|
|
|
|
Thanks I should have known that!!!!!!!!!
"When a friend hurts us, we should write it down in the sand, where the winds of forgiveness get in charge of erasing it away, and when something great happens, we should engrave it in the stone of the memory of the heart, where no wind can erase it" Nish on life [methinks]
"It's The Soapbox; topics are optional" Shog 9
|
|
|
|
|