Я застрял на ShellExecuteW но и другие функции Shell32.dll под WIN64 работают криво или ни как. Суть вопросв уже ясна: на автоматизированную пилораму рассчитанную на бревна 32м привезли 64 и говорят возьмете? ))
Ну за 2 посчитаете.
Ну у нас есть инт64 почему нет?
ну потому, что ИТН64 это один Х 2 бревна по 32, а 64 оно просто не может читать. В принципе.
И как?
ну, это совсем критично для функций которым надо указать hwnd
для ShellExecuteW оно и 0 сойдет. (зачем он там кстати?)
Приложение ТА оно запускает. Но оно приложение вылетает с критом при попытке использования.
А запускаю я бота для Линейдж ( можно смеяться )
Код
uses SysUtils,Classes;
//uses System; // недоступен
//uses ShellAPI; // недоступен
var
Wch: WideChar;
S:string;
winH,h1,h2,i: int64;
const
WPath = 'C:\L2\L2W KOT\L2WalkerLL.lnk'; //<-- полный путь до l2.exe (например D:\Lineage\system\l2.exe)
//WPath = 'C:\L2\L2W KOT\L2Walker.exe'; //<-- полный путь до l2.exe (например D:\Lineage\system\l2.exe)
// hwnd тип недоступен
function ShellExecuteW(hwnd: integer; lpOperation, lpFile, lpParameters, lpDirectory: PChar; nShowCmd: integer): integer; stdcall; external 'Shell32.dll';
function keybd_event(bVk, bScan: byte; dwFlags, dwExtraInfo: integer): integer; stdcall; external 'user32.dll';
function ShowWindow(hwnd:cardinal; action:integer):boolean; stdcall; external 'user32.dll';
function SetCursorPos(x, y : integer): boolean; stdcall; external 'user32.dll';
function mouse_event(dwFlags, dx, dy, dwData: byte; dwExtraInfo: integer): void; stdcall; external 'user32.dll';
function FindWindow(C1, C2: PChar): Longint; external 'FindWindowA@user32.dll stdcall';
begin
// winH:=ShellExecuteW(winH, 'open', PChar('C:\L2\L2WKOT\L2Walker.exe'), nil, PChar('C:\L2\L2W KOT\'), 1);
h1:=ShellExecuteW(winH, 'open', 'C:\L2\L2WKOT\L2WalkerLL.lnk', nil, nil, 1);
print('h1 '+ inttostr(h1)); // 2 // если путь ошибочен
// 42// программа запускается
print('winH '+ inttostr(winH)); // 0 // нну так и должно типа быть
end.
end.
//uses System; // недоступен
//uses ShellAPI; // недоступен
var
Wch: WideChar;
S:string;
winH,h1,h2,i: int64;
const
WPath = 'C:\L2\L2W KOT\L2WalkerLL.lnk'; //<-- полный путь до l2.exe (например D:\Lineage\system\l2.exe)
//WPath = 'C:\L2\L2W KOT\L2Walker.exe'; //<-- полный путь до l2.exe (например D:\Lineage\system\l2.exe)
// hwnd тип недоступен
function ShellExecuteW(hwnd: integer; lpOperation, lpFile, lpParameters, lpDirectory: PChar; nShowCmd: integer): integer; stdcall; external 'Shell32.dll';
function keybd_event(bVk, bScan: byte; dwFlags, dwExtraInfo: integer): integer; stdcall; external 'user32.dll';
function ShowWindow(hwnd:cardinal; action:integer):boolean; stdcall; external 'user32.dll';
function SetCursorPos(x, y : integer): boolean; stdcall; external 'user32.dll';
function mouse_event(dwFlags, dx, dy, dwData: byte; dwExtraInfo: integer): void; stdcall; external 'user32.dll';
function FindWindow(C1, C2: PChar): Longint; external 'FindWindowA@user32.dll stdcall';
begin
// winH:=ShellExecuteW(winH, 'open', PChar('C:\L2\L2WKOT\L2Walker.exe'), nil, PChar('C:\L2\L2W KOT\'), 1);
h1:=ShellExecuteW(winH, 'open', 'C:\L2\L2WKOT\L2WalkerLL.lnk', nil, nil, 1);
print('h1 '+ inttostr(h1)); // 2 // если путь ошибочен
// 42// программа запускается
print('winH '+ inttostr(winH)); // 0 // нну так и должно типа быть
end.
end.
L2Walker.exe запускается.
НО при попытке открыть данный процесс для патчинга (кто в курсе поймет) получаем сообщение
!! l2walker.exe (4330) cannot open process
Пробовал запускать и саму программу и ее ярлык с различными настройками. Ничего не меняется.
=================================
Мдя, тут не так, что бы Дельфи. Это скрипт движек Адреналина. Тип hwnd недоступен.
константы типа HWND_BOTTOM недоступны. Хотя это и не должно быть критично.
mouse_event и keybd_event из той же библиотеки работают.
FindWindow - вызывает ошибку доступа к памяти акцесс виолатион по адресу 0000000
Возможно есть более современные решения? Этим уже лет 10 как минимум.