Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2012, 14:28   #1
zipo666
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 42
Смех Работа с иконками(ошибка с LPCTSTR) - №2

Вот сам код :
Код:
// icon.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <windows.h>
#include <shlobj.h>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <cstdlib>
#include <iostream>
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "shlwapi.lib")
using namespace std;

void func(LPCTSTR pszShortcut)
{
   IPersistFile* ppf;
   IShellLink* pshl;
   WIN32_FIND_DATA wfd;

   // инициализируем COM-библиотеку
   ::CoInitialize(NULL);

   // создаем COM-объект и получаем указатель на IPersistFile
   ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
      IID_IPersistFile, reinterpret_cast<void**>(&ppf));

   // загружаем ярлык
#if defined(_UNICODE)
   ppf->Load(pszShortcut, STGM_READ);
#else
   LPWSTR pwszTemp = new WCHAR[_MAX_PATH];
   mbstowcs(pwszTemp, pszShortcut, _MAX_PATH);
   ppf->Load(pwszTemp, STGM_READ);
   delete[] pwszTemp;
#endif

   // получаем указатель на IShellLink
   ppf->QueryInterface(IID_IShellLink, reinterpret_cast<void**>(&pshl));

   // ищем объект, на который ссылается ярлык
   pshl->Resolve(NULL, SLR_ANY_MATCH | SLR_NO_UI);

   // получаем имя объекта и выводим его на консоль
   LPTSTR pszTarget = new TCHAR[_MAX_PATH];
   pshl->GetPath(pszTarget, _MAX_PATH, &wfd, 0);
	char* ascii = new char[wcslen(pszTarget) + 1]; // создаем char строку, но такой же длины, как и оригинальная wchar'овская
	wcstombs( ascii, pszTarget, wcslen(pszTarget) ); // собственно, конвертируем.. 
   cout <<ascii;
   delete[] pszTarget;

   // убираем за собой
   pshl->Release();
   ppf->Release();

   // завершаем работу с COM-библиотекой
   ::CoFreeUnusedLibraries();
   ::CoUninitialize();
}


//int _tmain(int argc, _TCHAR* argv[])
//{
//	LPCTSTR s = _T("C:\\0.lnk"); // LPCTSTR - строка, а передаёте символ (char)
//	func(s);
//	system("PAUSE");
//	return 0;
//}

int _tmain(int argc, _TCHAR* argv[])
{
	LPCTSTR s;
	char *str ="C:\\0.lnk";
	s=reinterpret_cast<LPCTSTR>(str);
	func(s);
	system("PAUSE");
	return 0;
}
Проблема в том что если закомментить последний блок , а предпоследний разкомментить - то программа работает как надо , а если все оставить как есть , выводит пустоту , хотя я вродь переконвертироал чар в лпстрклмнпрошщ.......Помогите , надеюсь лишь нас Ыть ....Заранее благодарю ..
П.с мне вообще надо , чтоб какаято переменная типа чар , кнвертиласт в лпстстр , а потом присваивалаь переменной того же типа -s , после чего успешно входила в выше описанную функцию - func ЫТЬ
zipo666 вне форума Ответить с цитированием
Старый 10.02.2012, 14:30   #2
zipo666
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 42
По умолчанию

Клава HE робит - ошибок потому мHoго Ыть
zipo666 вне форума Ответить с цитированием
Старый 10.02.2012, 17:27   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

zipo666

твой код - говнокод слишком перегружен всякими сущностями, затрудняющими его понимание. Пиши на C++ - будет намного проще.

например вся эта геморная хрень с ком-интерфейсами преобразуется к

Код:
void zzz(LPCTSTR pszShortcut)
{
	CComQIPtr<IPersistFile> spFile;
	spFile.CoCreateInstance(__uuidof(ShellLink));

	spFile->Load(CT2OLE(pszShortcut), STGM_READ);

	const CComQIPtr<IShellLink> spLink = spFile;
	spLink->Resolve(NULL, SLR_ANY_MATCH | SLR_NO_UI);	
		
	CString path;
	WIN32_FIND_DATA fd;
	spLink->GetPath(path.GetBuffer(MAX_PATH), MAX_PATH, &fd, 0);

	path.ReleaseBuffer();
	_putts(path);
}

CoInitialize...

LPCTSTR path = _T("C:\\my.lnk");
zzz(path);

CoUninitialize...
Rififi вне форума Ответить с цитированием
Старый 11.02.2012, 00:40   #4
zipo666
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 42
По умолчанию

Так а как мHe к примeру вмeсто "C:\\my.lnk" , вставить ввeдёHHую с клавы пeрeмeHHую типа char ??
zipo666 вне форума Ответить с цитированием
Старый 11.02.2012, 00:42   #5
zipo666
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 42
По умолчанию

тобиш поставить , типа ,
LPCTSTR s;
char *str ="C:\\0.lnk";
s=str;
func(s);
zipo666 вне форума Ответить с цитированием
Старый 11.02.2012, 01:16   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от zipo666 Посмотреть сообщение
тобиш поставить , типа ,
LPCTSTR s;
char *str ="C:\\0.lnk";
s=str;
func(s);
Очевидно, что Вы не до конца понимаете, что такое LPCTSTR. Немного освещу этот момент для Вас: LPCTSTR - это константа препроцессора, которая в зависимости от настроек (включён unicode или нет) заменяется на const char* или const wchar_t*. Известно, что в C есть два литерала строки - "" и L"", первый представляет ANSI-строки, второй UNICODE-строки. Макрос _T(), опять же, в зависимости от настроек компилятора, возвращает либо обычную строк, либо "широкую" (Unicode), добавляя префикс L к литералу строки. Если хотите произвести ввод с консоли, то можно воспользоваться функциями из заголовка tchar.h, например _fgetts
Код:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int _tmain() {
  TCHAR buf[80]; // TCHAR - char или wchar_t
  _fgetts (buf, 80, stdin);
  MessageBox (NULL, buf, _T("Title"), MB_OK);
}
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с иконками в с++(ошибка с LPCTSTR) zipo666 Общие вопросы C/C++ 2 10.02.2012 04:10
int --> LPCTSTR LockHeart Общие вопросы C/C++ 3 17.11.2011 10:24
_bstr_t -> LPCWSTR-> LPCTSTR->LPCSTR Lindemann66 Qt и кроссплатформенное программирование С/С++ 1 17.08.2011 16:45
Работа с иконками Aleksey1989 Помощь студентам 4 01.10.2010 17:25
Проблема с иконками в TreeView [Smarik] Общие вопросы Delphi 4 01.02.2009 21:02