Troudeloup
asked on
running an .lnk file in c++
how do I exec a app.lnk file in compiled code?
Forget ';' after _T("open")
ASKER
I think this is the only things i need, i trimed it a little bit
SHELLEXECUTEINFO info;
ZeroMemory(&info, sizeof(SHELLEXECUTEINFO));
info.cbSize = sizeof(SHELLEXECUTEINFO);
info.lpFile = _T("path to .lnk file");
info.lpVerb = _T("open");
ShellExecuteEx(&info);
i got this error.
mouse_ops.cpp:28: error: `_T' was not declared in this scope
SHELLEXECUTEINFO info;
ZeroMemory(&info, sizeof(SHELLEXECUTEINFO));
info.cbSize = sizeof(SHELLEXECUTEINFO);
info.lpFile = _T("path to .lnk file");
info.lpVerb = _T("open");
ShellExecuteEx(&info);
i got this error.
mouse_ops.cpp:28: error: `_T' was not declared in this scope
try to include tchar.h file or use Unicode version of function ShellExecuteExW and SHELLEXECUTEINFOW and L"path to .lnk file" instead of _T("path to .lnk file").
>>mouse_ops.cpp:28: error: `_T' was not declared in this scope
That means your project isn't unicode encoding.
If you use vc6 ,in your project setting->c/c++, add "UNICODE _UNICODE_" to preprocessor definitions .
Otherwise, if you use vc7 or vc8 ,in your project properties,add "UNICODE _UNICODE_" to preprocessor definitions .
Macro UNICODE means that it will support unicode in your own code;
Macro _UNICODE_ means that it will support unicode by (GNU)c lib you linked.
To support unicode , you need to use the function which support unicode.
As wizrr said, ShellExecuteExW and SHELLEXECUTEINFOW are necessary.
That means your project isn't unicode encoding.
If you use vc6 ,in your project setting->c/c++, add "UNICODE _UNICODE_" to preprocessor definitions .
Otherwise, if you use vc7 or vc8 ,in your project properties,add "UNICODE _UNICODE_" to preprocessor definitions .
Macro UNICODE means that it will support unicode in your own code;
Macro _UNICODE_ means that it will support unicode by (GNU)c lib you linked.
To support unicode , you need to use the function which support unicode.
As wizrr said, ShellExecuteExW and SHELLEXECUTEINFOW are necessary.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
>>>> That means your project isn't unicode encoding.
>>>> #include <tchar.h>
>>>> Or just use no _T() at all:
It makes no sense to push a prog to UNICODE in order to make the _T compile. The _T is a macro that allows to *switch* between ANSI and UNICODE characters. As jkr said you simply have to include the tchar.h or - better - follow his second advice to drop all _T () which rarely have any advantage for the task you are asking for.
Regards, Alex
>>>> #include <tchar.h>
>>>> Or just use no _T() at all:
It makes no sense to push a prog to UNICODE in order to make the _T compile. The _T is a macro that allows to *switch* between ANSI and UNICODE characters. As jkr said you simply have to include the tchar.h or - better - follow his second advice to drop all _T () which rarely have any advantage for the task you are asking for.
Regards, Alex
You can try also TEXT( instead of _T(. In any case you can define your own macro
#ifdef UNICODE
#define _UNICODE_OR_ANSI(text) L##text
#else
#define _UNICODE_OR_ANSI(text) ##text
#endif
and use it.
You also can use ansi version of functions ShellExecuteExA and SHELLEXECUTEINFOWA and just "path to .lnk file" instead of _T("path to .lnk file").
When working with _T like macro you should use _tcscmp instead of strcmp and e.g.. But when you using printf function's you must know is your format parameter is ANSI or UNICODE. See
#ifdef UNICODE
#define _UNICODE_OR_ANSI(text) L##text
#else
#define _UNICODE_OR_ANSI(text) ##text
#endif
and use it.
You also can use ansi version of functions ShellExecuteExA and SHELLEXECUTEINFOWA and just "path to .lnk file" instead of _T("path to .lnk file").
When working with _T like macro you should use _tcscmp instead of strcmp and e.g.. But when you using printf function's you must know is your format parameter is ANSI or UNICODE. See
char * g_csFormatBuffer = new char[5048];
std::string formatString(char * a_csFormat, ...) {
va_list param_pt;
va_start(param_pt, a_csFormat);
vsprintf(g_csFormatBuffer, a_csFormat, param_pt);
va_end(param_pt);
return (std::string(g_csFormatBuffer));
}
// this is thread-unsafe function it uses global buffer
//if you use function function like this
TCHAR * tcsParam = _T("PARAM");
std::string myStr = formatString("my parameter is %S", tcsParam);
// you will get errors when compiling without using UNICODE
std::string myStr = formatString("my parameter is %s", tcsParam);
// you will get errors when compiling using UNICODE
// ------------
// how to solve? define macro as follows
#ifdef UNICODE
#define AT_FMT "%S"
#else
#define AT_FMT "%s"
#endif
#define TAT_FMT _T( AT_FMT )
//and use it as follows:
std::string myStr = formatString("my parameter is " AT_FMT, tcsParam);
// that will compiled normally and works without errors if ANSI or UNCICODE is used
http://msdn2.microsoft.com/en-us/library/bb762154.aspx
http://msdn2.microsoft.com/en-us/library/bb759784.aspx
Open in new window