Ansi и Unicode код

Vlad302002

Новичок
Добрый день, возможно эту тему уже обсуждали раз 100, но я ни разу не программист и лишь только учусь делать некоторые функции. Поэтому сразу извиняюсь за такой вопрос.
Смотрите, у меня есть готовый хороший код, который прекрасно запускается на Ansi версии InnoSetup 5.6.1 (a), но есть проблема - тот же самый код не запускается на Unicode версии, то бишь InnoSetup (u) его компилирует,но при запуске указанная функция не работает (на любой Unicode версии не работает)... Поэтому из этого возникает вопрос - как заставить Unicode программу исполнять код из Ansi? :$ Буду очень признательный за ответ

Вот строчки кода (взял как пример код появления сплеша:

Код:
[Files]
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[Code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure InitializeWizard;
begin
  ExtractTemporaryFile('Splash.png');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
end;
 
Последнее редактирование модератором:

audiofeel

Старожил
Добрый день, возможно эту тему уже обсуждали раз 100, но я ни разу не программист и лишь только учусь делать некоторые функции. Поэтому сразу извиняюсь за такой вопрос.
Смотрите, у меня есть готовый хороший код, который прекрасно запускается на Ansi версии InnoSetup 5.6.1 (a), но есть проблема - тот же самый код не запускается на Unicode версии, то бишь InnoSetup (u) его компилирует,но при запуске указанная функция не работает (на любой Unicode версии не работает)... Поэтому из этого возникает вопрос - как заставить Unicode программу исполнять код из Ansi? :$ Буду очень признательный за ответ

Вот строчки кода (взял как пример код появления сплеша:

Files
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Code
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure InitializeWizard;
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
end;
замени string на Ansistring
procedure ShowSplashScreen(p1:HWND;p2:Ansistring;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
 
Последнее редактирование:

Vlad302002

Новичок
замени string на Ansistring
procedure ShowSplashScreen(p1:HWND;p2:Ansistring;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
Работает, спасибо большое. У меня есть ещё другой код, который также требует исправления, поэтому хочу сразу спросить: везде там надо будет ставить аналогичные строки?
А как быть например в таких случаях: ValueType: String;
 
Последнее редактирование:

audiofeel

Старожил
Работает, спасибо большое. У меня есть ещё другой код, который также требует исправления, поэтому хочу сразу спросить: везде там надо будет ставить аналогичные строки?
А как быть например в таких случаях: ValueType: String;
Я не понимаю как решать проблему которой еще нет, или которая возможно будет
 

Vlad302002

Новичок
Я не понимаю как решать проблему которой еще нет, или которая возможно будет
Такс, значит. Я переименовал все строчки кода так, как вы сказали, всё прекрасно. Скажите пожалуйста, есть ли ещё какие-то строчки в Ansi (типо string), из-за которого вот так может выкабениваться Unicode-версия. Это очень важно для меня, чтобы я чуть что сразу их переименовывал правильно и не писал ничего в таких темах и не засорял сайт :)
 

audiofeel

Старожил
Такс, значит. Я переименовал все строчки кода так, как вы сказали, всё прекрасно. Скажите пожалуйста, есть ли ещё какие-то строчки в Ansi (типо string), из-за которого вот так может выкабениваться Unicode-версия. Это очень важно для меня, чтобы я чуть что сразу их переименовывал правильно и не писал ничего в таких темах и не засорял сайт :)
Форматирование (BB-код):
#ifdef UNICODE
  #define A "W"
 type
    PChar = PAnsiChar;
#else
  #define A "A"
#endif
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
  external 'CallWindowProc{#A}@user32.dll stdcall';
как то так. желающие добавят свой опыт.
 

Vlad302002

Новичок
ага, то бишь минимальные изменения, хорошо. Но если что я тогда сюда скину и надеюсь что помогут)) спасибо
 

Vlad302002

Новичок
как то так. желающие добавят свой опыт.
Скажите пожалуйста, быть может вы сможете мне ещё в этом помочь:
Вот готовый (абсолютно рабочий) код добавления моего курсора, но он добавляться сугубо на кнопки (и то не на все), могли бы вы мне помочь сделать следующее: я хочу, чтобы мой курсор был по всей области установщика (вот всё что входит в эту квадратную область, на то курсор распространялся), а если выходишь за область установщика, то курсор пропадал (тобишь только в рамках установщика он был, а не полностью на компьютере). Спасибо! :clapping:

Код:
[Files]
Source: "pointer.cur"; DestDir: {tmp}; Flags: dontcopy

[Code]
Const
GCL_HCURSOR = (-12);
OCR_NORMAL = 32512;
var
OldCursor, NewCursor: Longint;
function LoadCursorFromFile(FileName: AnsiString): Longint;
external 'LoadCursorFromFileA@user32 stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
external 'SetClassLongA@user32 stdcall';

procedure InitializeWizard();
begin
  CursorFilename := ExpandConstant('{tmp}\pointer.cur');
  ExtractTemporaryFile('pointer.cur');
  NewCursor := LoadCursorFromFile(CursorFilename);
  OldCursor := SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, NewCursor);
end;
 
Последнее редактирование модератором:

audiofeel

Старожил
Скажите пожалуйста, быть может вы сможете мне ещё в этом помочь:
Вот готовый (абсолютно рабочий) код добавления моего курсора, но он добавляться сугубо на кнопки (и то не на все), могли бы вы мне помочь сделать следующее: я хочу, чтобы мой курсор был по всей области установщика (вот всё что входит в эту квадратную область, на то курсор распространялся), а если выходишь за область установщика, то курсор пропадал (тобишь только в рамках установщика он был, а не полностью на компьютере). Спасибо! :clapping:

Files
Source: "pointer.cur"; DestDir: {tmp}; Flags: dontcopy

Code
Const
GCL_HCURSOR = (-12);
OCR_NORMAL = 32512;
var
OldCursor, NewCursor: Longint;
function LoadCursorFromFile(FileName: AnsiString): Longint;
external 'LoadCursorFromFileA@user32 stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
external 'SetClassLongA@user32 stdcall';

procedure InitializeWizard();
begin
CursorFilename := ExpandConstant('{tmp}\pointer.cur');
ExtractTemporaryFile('pointer.cur');
NewCursor := LoadCursorFromFile(CursorFilename);
OldCursor := SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, NewCursor);
end;
(1) FAQ - FAQ по Inno Setup | Страница 4 | Форум Krinkels.org
 

Vlad302002

Новичок
Добрый день. Посмотрел - работает ТОЛЬКО на версии Inno Setup Ultra v5.5.1.ee2 (u), на моей innosetup-5.6.1 (u) не работает (даже не компилируется), пришлось переходить на Ultra. А если не секрет, почему не робит на 5.6.1 (u)? Вроде юникод и там и там, просто 5.6.1 выпущена в 2018 году, а Inno Setup Ultra 5.5.1 гораздо раньше, собственно поэтому я и на более новой версии работал. С точки зрения удобства какая лучше? Больше возможностей я так понимаю именно в Ultra. Просто основной вопрос в древности этой версии.
 

audiofeel

Старожил
Добрый день. Посмотрел - работает ТОЛЬКО на версии Inno Setup Ultra v5.5.1.ee2 (u), на моей innosetup-5.6.1 (u) не работает (даже не компилируется), пришлось переходить на Ultra. А если не секрет, почему не робит на 5.6.1 (u)? Вроде юникод и там и там, просто 5.6.1 выпущена в 2018 году, а Inno Setup Ultra 5.5.1 гораздо раньше, собственно поэтому я и на более новой версии работал. С точки зрения удобства какая лучше? Больше возможностей я так понимаю именно в Ultra. Просто основной вопрос в древности этой версии.
да это ж не молоко, не испортится. 5.5.1-5.6.1
вот вам вариант на не расширенную версию

code_language.pascal:
[Files]
Source: "MyCursor.cur"; Flags: dontcopy

[Code]
const
  GCL_HCURSOR = (-12);

function LoadCursorFromFile(lpFileName: string): LongWord;
  external 'LoadCursorFromFileW@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
  external 'SetClassLongW@user32 stdcall';

procedure SetControlsCursor(Control: TWinControl; Cursor: LongWord);
var
  I: Integer;
begin
  SetClassLong(Control.Handle, GCL_HCURSOR, Cursor);

  for I := 0 to Control.ControlCount - 1 do
  begin
    if Control.Controls[I] is TWinControl then
    begin
      SetControlsCursor(TWinControl(Control.Controls[I]), Cursor);
    end;
  end;
end;

procedure InitializeWizard();
var
  PathToCursorFile: string;
  Cursor: LongWord;
begin
  ExtractTemporaryFile('MyCursor.cur')
  PathToCursorFile := ExpandConstant('{tmp}\MyCursor.cur');
  Cursor:= LoadCursorFromFile(PathToCursorFile);
//  SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, Cursor);
  SetControlsCursor(WizardForm, Cursor);
end;
 

Vlad302002

Новичок
вот вам вариант на не расширенную версию
Та мне то норм на Ультра, пускай она стоит, но спасибо большое за помощь)) раз в ней возможностей больше то пускай стоит Ультра.

У меня ещё вопрос к вам такой, можно ли (конечно можно, вопрос только КАК) изменить значок интерфейса жёлтого треугольника? Если что, это сообщения выводится при наличии в пути установки русских букв, поэтому хотелось бы поменять на свой элемент.
Безымянный.png
 

audiofeel

Старожил
Та мне то норм на Ультра, пускай она стоит, но спасибо большое за помощь)) раз в ней возможностей больше то пускай стоит Ультра.

У меня ещё вопрос к вам такой, можно ли (конечно можно, вопрос только КАК) изменить значок интерфейса жёлтого треугольника? Если что, это сообщения выводится при наличии в пути установки русских букв, поэтому хотелось бы поменять на свой элемент.
Посмотреть вложение 8291
А вот с этим не помогу. С нуля нужно думать ентот месседж бокс, если хотите другой свой значок. (Кто понимает, пусть подключится)
Так как в версии 5.6.1 нет дизайнера месседж боксов, то могу Вам только посоветовать вот такую небольшую программу по дизайну этих месседж боксов.
Выбор там не большой, но он есть
4.png
 

Вложения

Vlad302002

Новичок
Так как в версии 5.6.1 нет дизайнера месседж боксов
Я вас понял, спасибо.

Единственное у меня возникла странная проблема при переходе с Ansi на Unicode, у меня установщик часть изображения на странице лицензии сьедает (буквально прозрачный)... Объясняю на скринах... Один и тот же код (прилагаю его под скринами) работает по разному на Ansi и Unicode. С Анси версией такого нет, там страница лицензии отображается как надо, на Юникоде , в поле для текста лицензии, отображается символы из другой страницы (он банально сбил изображение (если посмотреть, то текст лицензии теперь отображается левее), из-за небольшая часть поля для него отсутствует, и он видит часть прошлой страницы). :sorry:(такое на всех Юникод версиях, и на Ультре и на обычной)
Единственное отличие в коде между Анси и Юникод-версиями, это я заменил String на Ansistring

Безымянный.png
Код:
[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[Code]
procedure LoadSkin(lpszPath: Ansistring; lpszIniFileName: Ansistring); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';
function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('steam.cjstyles');
  LoadSkin(ExpandConstant('{tmp}')+'\steam.cjstyles', '');
  Result:=True;
end;

procedure InitializeWizard();
begin
  WizardForm.BeveledLabel.Enabled:=True;
end;

procedure DeinitializeSetup();
begin
  ShowWindow(WizardForm.Handle,0);
  UnloadSkin();
end;
 
Последнее редактирование:

audiofeel

Старожил
"C:\Program Files (x86)\Inno Setup 5\Dll Examples\IsSkinEx [3.0.0.2]"
Вот тут у Вас должен быть правильный пример для расширенной unicode версии. подключение скина.
(По моему проблема в этом)
 

Vlad302002

Новичок
"C:\Program Files (x86)\Inno Setup 5\Dll Examples\IsSkinEx [3.0.0.2]"
Вот тут у Вас должен быть правильный пример для расширенной unicode версии. подключение скина.
так-так-так, я поставил тот пример, который был там, разницы никакой- ошибка эта как была, так и осталась. :(
но эта проблема возникает на любой юникод-версии, и на расширенной (ультра) и на обычной, тут конкретно проблема в юникод-версии...
Может мой файл isskin.dll (он был взят из IS GameScript Generator)заточен только под Анси версию, и работает на Юникоде соответственно коряво... Если нужно найти dll, то было б здорово если б сказали откуда скачать её, а то я фиг знает. Но в папке той никаких других dll, там только скрипт.

1706704464197.png
 

audiofeel

Старожил
так-так-так, я поставил тот пример, который был там, разницы никакой- ошибка эта как была, так и осталась. :(
но эта проблема возникает на любой юникод-версии, и на расширенной (ультра) и на обычной, тут конкретно проблема в юникод-версии...
Может мой файл isskin.dll (он был взят из IS GameScript Generator)заточен только под Анси версию, и работает на Юникоде соответственно коряво... Если нужно найти dll, то было б здорово если б сказали откуда скачать её, а то я фиг знает. Но в папке той никаких других dll, там только скрипт.

Посмотреть вложение 8295
Все есть в папке "C:\Program Files (x86)\Inno Setup 5\Dll Pack" = IsSkinExW.dll
 

tihiy_don

Старожил
Я бы рекомендовал вам использовать на isskin, а VCL.

 

Vlad302002

Новичок
Все есть в папке
Такс, dll действительно лежат, но толку увы нет( Всё равноне работает. Попробую способ от Tihij_Don


Я бы рекомендовал вам использовать на isskin, а VCL.
сейчас попробую, буду смотреть... отпишу получится или нет,, дай то Бог чтоб получилось.
 

Vlad302002

Новичок
Все есть в папке "C:\Program Files (x86)\Inno Setup 5\Dll Pack" = IsSkinExW.dll
Во бредятина, уже установщик с 0 чистый создал, попробовал в него всякие разные коды для IsSkin, IsSkinExW и прочие такого рода ( VCL не пробовал, даже скачать с сайта не получается). Уже даже не знаю что делать. ;( Он тупо буквально вырезает часть на поле лицензии., вот там, откуда текст он вывод из rtf файла лицензии... Я вообще не понимаю причину... И в инете чет никто не писал про такое. главное на ansi версии всё ок, на unicode проблема

1706709067219.png
 
Сверху