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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2011, 20:21   #1
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию Юникод в Delphi 7

Добрый день Всем.
Вообщем такая проблема, при компиляции проэкта выбивает ошибку:
Код:
[Error] U_Utils.pas(243): Incompatible types: 'Char' and 'WideChar'
[Error] U_Utils.pas(244): Incompatible types: 'Char' and 'WideChar'
Прочитал в гугле, мол что-то с юникод.
Вот часть кода, где он выбивает эту ошибку:
Код:
Function WriteResData(sServerFile: string;lpType:Pwidechar; pFile: pointer; Size: LongInt; Name: String):Boolean;
var
  hResourceHandle: THandle;
begin
  hResourceHandle := BeginUpdateResourceW(Pchar(sServerFile), False);
  Result := UpdateResourceW(hResourceHandle, lpType, pchar(Name), 0, pFile, Size);
  EndUpdateResourceW(hResourceHandle, False);
end;
Помогите, кто может.
Заранее большое спасибо.
iLnes вне форума Ответить с цитированием
Старый 30.11.2011, 20:44   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

поменять тип Name на WideString.

veniside, блин, pChar пропустил.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 30.11.2011 в 20:50.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.11.2011, 20:45   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

string заменить на WideString, pchar на PWideChar
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 30.11.2011, 23:39   #4
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Опять появилась ошибка:
Сам код:
Код:
procedure cloneVersion(fromfile,filepath:string);
var
  dwHandle, cbTranslate: cardinal;
  sizeVers: DWord;
  lpData, langData: Pointer;
  lpTranslate: WORD;
  hRes : THandle;
begin
  sizeVers := GetFileVersionInfoSize(PChar(fromfile), dwHandle);
  If sizeVers <> 0 then
  begin
    GetMem(lpData, sizeVers);
    ZeroMemory(lpData, sizeVers);
    GetFileVersionInfo (PChar(fromfile), 0, sizeVers, lpData);
    If VerQueryValue (lpData, '\VarFileInfo\Translation', langData, cbTranslate) then
    begin
      hRes := BeginUpdateResourceW(PChar(filepath), FALSE);
      if hRes <> 0 then
      begin
        CopyMemory(@lpTranslate, langData, 2);
          UpdateResourceW(hRes, RT_VERSION , MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate, lpData, sizeVers);
        EndUpdateResourceW(hRes, FALSE);
      end;
    end;
    FreeMem(lpData);
  end;
end;
Ошибки которые выдает:
Код:
[Error] U_Cloner.pas(28): Incompatible types: 'Char' and 'WideChar'
[Error] U_Cloner.pas(32): Incompatible types: 'Char' and 'WideChar'
[Error] U_Cloner.pas(32): Incompatible types: 'Char' and 'WideChar'
Без понятия, что сделать) Кто поможет?
Вообщем, первая ошибка здесь:
Код:
hRes := BeginUpdateResourceW(PChar(filepath), FALSE);
2 другие тут:
Код:
UpdateResourceW(hRes, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate, lpData, sizeVers);
iLnes вне форума Ответить с цитированием
Старый 30.11.2011, 23:44   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вам тут точно юникод то нужен?
может проще взять привычные вашей версии среды функции?

а так замены те же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2011, 00:03   #6
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Ну читал я, что проблема в юникоде.
Эту строку я исправил допустим:
Код:
hRes := BeginUpdateResourceW(PWideChar(filepath), FALSE);
Но вот с этой, не могу разобраться:
Код:
UpdateResourceW(hRes, RT_VERSION, MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate, lpData, sizeVers);
как понял, проблема в RT_VERSION и VS_VERSION_INFO. Они обьявлены в Windows.pas как MakeIntResourceA = PAnsiChar;
iLnes вне форума Ответить с цитированием
Старый 01.12.2011, 00:08   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

придется переписать руками раз вы упорно хотите Wide-версии!

я вам прдлагаю, взять то что есть у вас,а именно Анси строки.
итог:
Код:
Function WriteResData(sServerFile: string;lpType:Pwidechar; pFile: pointer; Size: LongInt; Name: String):Boolean;
var
  hResourceHandle: THandle;
begin
  hResourceHandle := BeginUpdateResource(Pchar(sServerFile), False);
  Result := UpdateResource(hResourceHandle, lpType, pchar(Name), 0, pFile, Size);
  EndUpdateResource(hResourceHandle, False);
end;
Код:
procedure cloneVersion(fromfile,filepath:string);
var
  dwHandle, cbTranslate: cardinal;
  sizeVers: DWord;
  lpData, langData: Pointer;
  lpTranslate: WORD;
  hRes : THandle;
begin
  sizeVers := GetFileVersionInfoSize(PChar(fromfile), dwHandle);
  If sizeVers <> 0 then
  begin
    GetMem(lpData, sizeVers);
    ZeroMemory(lpData, sizeVers);
    GetFileVersionInfo (PChar(fromfile), 0, sizeVers, lpData);
    If VerQueryValue (lpData, '\VarFileInfo\Translation', langData, cbTranslate) then
    begin
      hRes := BeginUpdateResource(PChar(filepath), FALSE);
      if hRes <> 0 then
      begin
        CopyMemory(@lpTranslate, langData, 2);
          UpdateResource(hRes, RT_VERSION , MAKEINTRESOURCE(VS_VERSION_INFO), lpTranslate, lpData, sizeVers);
        EndUpdateResource(hRes, FALSE);
      end;
    end;
    FreeMem(lpData);
  end;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2011, 00:09   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

iLnes вам уже намекнули, что лучше использовать Ansi-шные функции BeginUpdateResourceA, UpdateResourceA и пр. И не будет никакой запарки с юникодом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.12.2011, 00:11   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
iLnes вам уже намекнули, что лучше использовать Ansi-шные функции BeginUpdateResourceA, UpdateResourceA и пр. И не будет никакой запарки с юникодом
я даже написал больше, функции без постиксов, это переносимее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2011, 02:11   #10
iLnes
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 66
По умолчанию

Спасибо большое Феникс, всё работает.
Тут правда еще очень много работы.
iLnes вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi и Юникод demiancz Общие вопросы Delphi 8 23.08.2011 18:00
Юникод в delphi vitaaly Общие вопросы Delphi 4 09.05.2011 15:18
Какая версия Delphi поддерживает Юникод? Arassir Общие вопросы Delphi 3 29.03.2011 21:11
Юникод и Delphi 7 Лубышев Общие вопросы Delphi 12 02.08.2009 00:11
Юникод для Delphi netuser Общие вопросы Delphi 1 20.12.2007 02:43