Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / перевод приложения на 64 бит / 25 сообщений из 56, страница 1 из 3
19.01.2017, 13:34
    #39387599
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
по работе необходимо часто просматривать содержимое файлов запросов на сертификат и сертификатов ЭП(электронной подписи).
Написал программу для этого и на основе её плагин для тотал коммандера. Писал на Delphi 7 и дублировал на lazarus. Приложение понятное дело - 32-битное. Ну вот захотелось плагин сделать для 64-битного тотал коммандера. Естественно сразу наткнулся на грабли : приложение скомпилировалось (на lazarus64) но функции cryptoapi перестали работать. По-гуглив, изменил тип используемых переменных dword и cardinal на dword_ptr. Функции cryptoapi заработали. Но немогу решить проблему в этом коде:
На 32 бит работает такое:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
....
type
  PCERT_EXTENSION = ^CERT_EXTENSION;
  CERT_EXTENSION = record
    pszObjId :LPSTR;
    fCritical :BOOL;
    Value :CRYPT_OBJID_BLOB;
  end; 

CERT_EXTENSIONS = array of CERT_EXTENSION; 
....
for i:=0 to pCertContext.pCertInfo.cExtension-1 do
 begin
 showmessage( CERT_EXTENSIONS(pCertContext.pCertInfo.rgExtension)[i].pszObjId);
 end;  


а на 64 бит нет. первый [0].pszObjId элемент массива видит, а при обращении к [1].pszObjId ошибка cannot access memory at address
а обращение к CERT_EXTENSIONS(pCertContext.pCertInfo.rgExtension)[i]. fCritical ошибок не вызывает.
Код: pascal
1.
pszObjId :LPSTR;  LPSTR = Pchar;  

может для 64 бит тут надо другой тип?
немогу найти.
...
Рейтинг: 0 / 0
19.01.2017, 13:51
    #39387612
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81может для 64 бит тут надо другой тип?
Сравни Sizeof в 32 и в 64 бита.
...
Рейтинг: 0 / 0
19.01.2017, 14:09
    #39387627
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
wadmanalexer81может для 64 бит тут надо другой тип?
Сравни Sizeof в 32 и в 64 бита.
да разный
Код: pascal
1.
2.
3.
4.
var h:Pchar;

h:=Pchar('d');
showmessage(h+' '+inttostr(sizeof(h))


32 бит - 4
64 бит - 8
...
Рейтинг: 0 / 0
19.01.2017, 14:18
    #39387634
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81, тебе намекают на неверный размер CERT_EXTENSION из-за ошибочного выравнивания.
...
Рейтинг: 0 / 0
19.01.2017, 14:27
    #39387644
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
GunSmokeralexer81, тебе намекают на неверный размер CERT_EXTENSION из-за ошибочного выравнивания.
Не понимаю что это означает.
...
Рейтинг: 0 / 0
19.01.2017, 14:28
    #39387646
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81GunSmokeralexer81, тебе намекают на неверный размер CERT_EXTENSION из-за ошибочного выравнивания.
Не понимаю что это означает.
Это значит, что нужно сравнить размер
GunSmokerневерный размер CERT_EXTENSION из-за ошибочного выравнивания.
...
Рейтинг: 0 / 0
19.01.2017, 14:37
    #39387657
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
проверил каждый элемент массива
32 бит - CERT_EXTENSION[i] -16
64 бит - CERT_EXTENSION[i] -28
...
Рейтинг: 0 / 0
19.01.2017, 14:47
    #39387674
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer8132 бит - CERT_EXTENSION[i] -16
64 бит - CERT_EXTENSION[i] -28
Многовато, должно быть на 8 байт больше, а не на 12, потому что только два указателя в структуре.
Код: plaintext
1.
2.
3.
4.
5.
typedef struct _CERT_EXTENSION {
  LPSTR            pszObjId;
  BOOL             fCritical;
  CRYPT_OBJID_BLOB Value;
} CERT_EXTENSION, *PCERT_EXTENSION;


Код: plaintext
1.
2.
3.
4.
typedef struct _CRYPTOAPI_BLOB {
  DWORD cbData;
  BYTE  *pbData;
} CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB;
...
Рейтинг: 0 / 0
19.01.2017, 14:48
    #39387677
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer8164 бит - CERT_EXTENSION[i] -28

Есть мнение, что должно быть 32, ибо 28 на 8 не делится. У тебя выравнивание записей на 4 байта, а должно быть на 8 байт.
...
Рейтинг: 0 / 0
19.01.2017, 14:57
    #39387693
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81может для 64 бит тут надо другой тип?
немогу найти.

LPSTR = PAnsiChar;
...
Рейтинг: 0 / 0
19.01.2017, 15:09
    #39387710
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
да получается что в pCertContext.pCertInfo.rgExtension не то что надо(или неполностью)
32 бит sizeof(pCertContext.pCertInfo.rgExtension^)=16
64 бит sizeof(pCertContext.pCertInfo.rgExtension^)=28
CertFindExtension тоже не находит расширения
...
Рейтинг: 0 / 0
19.01.2017, 16:14
    #39387787
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
32 бит 64 бит
sizeof(pCertContext^.pCertInfo^.rgExtension^.fCritical) 4 4
sizeof(pCertContext^.pCertInfo^.rgExtension^.pszObjId) 4 8
sizeof(pCertContext^.pCertInfo^.rgExtension^.Value) 8 16

есть мысли где неправильно? и почему?
...
Рейтинг: 0 / 0
19.01.2017, 17:34
    #39387853
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  _CRYPTOAPI_BLOB = record
    cbData: DWORD;
    pbData: LPBYTE;
  end;
  CRYPT_OBJID_BLOB = _CRYPTOAPI_BLOB;


  PCERT_EXTENSION = ^CERT_EXTENSION;
  {$EXTERNALSYM PCERT_EXTENSION}
  _CERT_EXTENSION = record
    pszObjId: LPSTR;
    fCritical: BOOL;
    Value: CRYPT_OBJID_BLOB;
  end;
  CERT_EXTENSION = _CERT_EXTENSION;
  TCertExtension = CERT_EXTENSION;
  PCertExtension = PCERT_EXTENSION;



У меня x32=16, x64=32
...
Рейтинг: 0 / 0
19.01.2017, 18:18
    #39387885
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81,

не работает конкретно в wlx-плагине или в обычном приложении тоже?

сделал тестовое приложение в Lazarus версии 1.6.2, всё нормально работает.

случайно не используете модуль-огрызок Wcrypt2.pas ? В лазарусе имеется JwaWinCrypt.
...
Рейтинг: 0 / 0
19.01.2017, 19:51
    #39387937
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81Не понимаю что это означает.

в таком случае, увы, тебе едва ли стоит САМОМУ заниматься самостоятельным использованием DLL, пока не поймешь.

потому что это стандартная грабля с переносом структур данных между языками, когда компилятор ничего не может проверить и доверяет человеку абсолютно. И тут тебе повезло, что ошибка была такая грубая, что программа мгновенно вылетела. А если бы ошибка была тоньше, то она могла бы внешне не проявиться и только втихую портить данные, несколько месяцев или лет....

-------------

Как вариант, для Delphi есть JEDI Win API Translation and Crypto API Library

К сожалению, проект полузаброшенный, поэтому разобраться какую версию ставить ( 2.3 / 2.4. , с сайта или с SVN ) можно только методом тыка. Тупо включаешь эти модули в проект - и они не компилируются.

Но простейшие WinXP+ Crypto функции в Delphi XE2 Win32 работают. Когда заставишь скомпилироваться.
Это тем более удобно, что ЕМНИП в разных версиях Windows функции расположены в разных DLL.

Но я не пробовал её в Delphi x64 и не знаю, насколько оно совместимо.
А если совместимо с Delphi x64 - ещё не факт что с ней совместим будет FPC x64

И всё же - попробовать использовать уже сделанное - вполне себе вариант.
...
Рейтинг: 0 / 0
20.01.2017, 09:17
    #39388129
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
Ghost Writeralexer81,

не работает конкретно в wlx-плагине или в обычном приложении тоже?

сделал тестовое приложение в Lazarus версии 1.6.2, всё нормально работает.

случайно не используете модуль-огрызок Wcrypt2.pas ? В лазарусе имеется JwaWinCrypt.
да пилю напильником Wcrypt2.pas.
...
Рейтинг: 0 / 0
20.01.2017, 09:23
    #39388134
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
к сожалению те примеры которые попадались не работали c JwaWinCrypt. и я закопался в Wcrypt2
...
Рейтинг: 0 / 0
20.01.2017, 09:29
    #39388139
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81к сожалению те примеры которые попадались не работали c JwaWinCrypt. и я закопался в Wcrypt2

alexer81,
Потрать немного времени и вернись лучше обратно на JwaWinCrypt.
...
Рейтинг: 0 / 0
20.01.2017, 16:21
    #39388573
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
sql2012alexer81к сожалению те примеры которые попадались не работали c JwaWinCrypt. и я закопался в Wcrypt2

alexer81,
Потрать немного времени и вернись лучше обратно на JwaWinCrypt.
да действительно lazarus 1.6.2 c использованием JwaWinCrypt код работает нормально.
а вот времени придется потратить много чтобы перейти на JwaWinCrypt.
...
Рейтинг: 0 / 0
20.01.2017, 16:51
    #39388591
wlx-plugin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81, Ghost Writer

Ребят, а не поделитесь кодом для wlx-plugina в Lazarus под Win64?

Интересует пример инициализации LCL и последующего создания экземпляра формы именно для 64 бит.

Уже долго мучаюсь - не могу собрать wlx-plugin для 64-х битного TotalCommander-а.
Для 32-х битного TotalCommander-а работает пример из сети, а на 64 - падает.

Вот мой код

проект:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
library myplugin;

{$mode objfpc}{$H+}
{$message warn 'Check OriginalFilename into version info in project options'}

uses
  // this includes the LCL widgetset
  Interfaces,
  Forms,
  SysUtils,
  Windows,
  // project
  ufmMain;

const
  cDetectStringCmd = 'EXT="TEST" | EXT="TES" | EXT="TST"';
  cDetectStringExt = '.TEST.TES.TST';

procedure ListGetDetectString(DetectString: PChar; MaxLen: Integer); stdcall;
begin
  StrLCopy(DetectString, PChar(cDetectStringCmd), MaxLen);
end;

function FileExtIsFits(FileToLoad: PChar): Boolean;
var
  Ext: string;
begin
  Result := False;
  Ext := ExtractFileExt(string(FileToLoad));
  Ext := UpperCase(Ext);
  Result := (Pos(Ext, cDetectStringExt) > 0);
end;

function ListLoad(ListerWin: HWND; FileToLoad: PChar; ShowFlags: Integer): HWND; stdcall;
begin
  if FileExtIsFits(FileToLoad) then
    Result := TfmMain.PluginShow(ListerWin, string(FileToLoad))
  else
    Result := 0;
end;

function ListLoadNext(ListerWin, PluginWin: HWND; FileToLoad: PChar; ShowFlags: Integer): Integer; stdcall;
begin
  if FileExtIsFits(FileToLoad) then
    Result := TfmMain.PluginShowNext(PluginWin, string(FileToLoad))
  else
    Result := 0;
end;

procedure ListCloseWindow(PluginWin: HWND); stdcall;
begin
  TfmMain.PluginHide(PluginWin);
end;

{ Exprot }

exports
 ListGetDetectString,
 ListLoad,
 ListLoadNext,
 ListCloseWindow;

{$R *.res}

begin
  Application.Initialize;
end.



форма:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
  TfmMain = class(TForm)
  private
    FTotCmdWin: HWND;    // handle of TotalCommander window
    FParentWin: HWND;    // handle of Lister window
    FQuickView: Boolean; // Ctrl+Q panel
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor CreateParented(AParentWindow: HWND);
  public
    class function PluginShow(ListerWin: HWND; FileToLoad: string): HWND;
    class function PluginShowNext(PluginWin: HWND; FileToLoad: string): Integer;
    class function PluginHide(PluginWin: HWND): HWND;
  end;

implementation

{$R *.lfm}

{ TfmMain }

class function TfmMain.PluginShow(ListerWin: HWND; FileToLoad: string): HWND;
var
  fmMain: TfmMain;
begin
  fmMain := nil;
  try
    fmMain := TfmMain.CreateParented(ListerWin);
    fmMain.Label1.Caption := FileToLoad;
    fmMain.Show;
    SetWindowLong(fmMain.Handle, GWL_USERDATA, PtrInt(fmMain));
    // set focus to our window
    if not fmMain.FQuickView then
    begin
      PostMessage(fmMain.Handle, WM_SETFOCUS, 0, 0);
      fmMain.SetFocus;
    end;
    Result := fmMain.Handle;
  except
    if Assigned(fmMain) then
      fmMain.Free;
    Result := 0;
  end;
end;

class function TfmMain.PluginShowNext(PluginWin: HWND; FileToLoad: string): Integer;
var
  fmMain: TfmMain;
begin
  fmMain := TfmMain(GetWindowLong(PluginWin, GWL_USERDATA));
  try
    fmMain.Label1.Caption := FileToLoad;
    fmMain.Show;
    Result := 0;
  except
    Result := 1;
  end;
end;

class function TfmMain.PluginHide(PluginWin: HWND): HWND;
var
  fmMain: TfmMain;
begin
  Result := 0;
  fmMain := TfmMain(GetWindowLong(PluginWin, GWL_USERDATA));
  try
    fmMain.Free;
  except
  end;
end;

procedure TfmMain.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := (WS_CHILD or WS_MAXIMIZE) and not WS_CAPTION and not WS_BORDER;
  Params.WindowClass.cbWndExtra := SizeOf(PtrInt); // ~4/8 bytes for form
end;

constructor TfmMain.CreateParented(AParentWindow: HWND);
begin
  inherited CreateParented(AParentWindow);
  FTotCmdWin  := FindWindow('TTOTAL_CMD', nil);
  FParentWin  := AParentWindow;
  FQuickView  := Windows.GetParent(FParentWin) <> 0;
end;

...
Рейтинг: 0 / 0
20.01.2017, 18:17
    #39388650
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
wlx-plugin
Код: pascal
1.
DetectString: PChar



нет такого типа!

есть PAnsiChar, есть PWideChar

в общем - надо смотреть документацию, в какой конкретно кодировке приходят и уходят эти строки

ЕМНИП в FPC нынешнем строки вообще UTF-8, то есть не сопадают ни с одним из вариантов string/char/pchar в Deдphi
...
Рейтинг: 0 / 0
20.01.2017, 22:19
    #39388756
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81Ghost Writeralexer81,

не работает конкретно в wlx-плагине или в обычном приложении тоже?

сделал тестовое приложение в Lazarus версии 1.6.2, всё нормально работает.

случайно не используете модуль-огрызок Wcrypt2.pas ? В лазарусе имеется JwaWinCrypt.
да пилю напильником Wcrypt2.pas.напильник драчевый ?
попробовал подкинуть Wcrypt2.pas в лазарус - 70 ворнингов типа Wcrypt2.pas(8441,1) Warning: Comment level 3 found и fatal error
...
Рейтинг: 0 / 0
20.01.2017, 22:32
    #39388763
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
вот морока теперь..
есть системный(или как это называется незнаю) тип TFileTime(описан в Struct.inc) и в JwaWinType зачем-то определен TFileTime. компилятор говорит что это не одно и тоже.
А я ранее преобразовывал дату через FileTimeToSystemTime

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function FileTimeToSTRTime(ft:_FILETIME):string;
var TZ              : TTimeZoneInformation;
    systemTime      : TSYSTEMTIME;
 begin
GetTimeZoneInformation(TZ);
 FileTimeToSystemTime(ft, systemTime);
 SystemTimeToTzSpecificLocalTime(@TZ,systemTime,systemTime);
 Result:=FormatDateTime('dd.mm.yyyy hh:mm:ss', SystemTimeToDateTime(SystemTime));
end; 


FileTimeToSystemTime нужен TFileTime из в Struct.inc
а у меня есть pCertContext^.pCertInfo^.NotBefore - TFileTime из JwaWinType
как их состыковать?
...
Рейтинг: 0 / 0
20.01.2017, 22:37
    #39388766
alexer81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
авторнапильник драчевый ?
попробовал подкинуть Wcrypt2.pas в лазарус - 70 ворнингов типа Wcrypt2.pas(8441,1) Warning: Comment level 3 found и fatal error
я им с 2012 пользуюсь. и за это время многое подправил и добавил. на 32 бита прекрасно всё работало. Один модуль для Delphi7 и Lazarusa
...
Рейтинг: 0 / 0
20.01.2017, 23:00
    #39388770
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
перевод приложения на 64 бит
alexer81,

вместо модуля Windows подключи JwaWindows
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / перевод приложения на 64 бит / 25 сообщений из 56, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]