powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / перевод приложения на 64 бит
25 сообщений из 56, страница 1 из 3
перевод приложения на 64 бит
    #39387599
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по работе необходимо часто просматривать содержимое файлов запросов на сертификат и сертификатов ЭП(электронной подписи).
Написал программу для этого и на основе её плагин для тотал коммандера. Писал на 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
перевод приложения на 64 бит
    #39387612
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexer81может для 64 бит тут надо другой тип?
Сравни Sizeof в 32 и в 64 бита.
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387627
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
перевод приложения на 64 бит
    #39387634
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexer81, тебе намекают на неверный размер CERT_EXTENSION из-за ошибочного выравнивания.
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387644
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmokeralexer81, тебе намекают на неверный размер CERT_EXTENSION из-за ошибочного выравнивания.
Не понимаю что это означает.
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387646
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexer81GunSmokeralexer81, тебе намекают на неверный размер CERT_EXTENSION из-за ошибочного выравнивания.
Не понимаю что это означает.
Это значит, что нужно сравнить размер
GunSmokerневерный размер CERT_EXTENSION из-за ошибочного выравнивания.
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387657
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проверил каждый элемент массива
32 бит - CERT_EXTENSION[i] -16
64 бит - CERT_EXTENSION[i] -28
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387674
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
перевод приложения на 64 бит
    #39387677
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexer8164 бит - CERT_EXTENSION[i] -28

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

LPSTR = PAnsiChar;
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387710
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да получается что в pCertContext.pCertInfo.rgExtension не то что надо(или неполностью)
32 бит sizeof(pCertContext.pCertInfo.rgExtension^)=16
64 бит sizeof(pCertContext.pCertInfo.rgExtension^)=28
CertFindExtension тоже не находит расширения
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387787
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
перевод приложения на 64 бит
    #39387853
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
перевод приложения на 64 бит
    #39387885
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexer81,

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

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

случайно не используете модуль-огрызок Wcrypt2.pas ? В лазарусе имеется JwaWinCrypt.
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39387937
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
перевод приложения на 64 бит
    #39388129
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ghost Writeralexer81,

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

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

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

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

alexer81,
Потрать немного времени и вернись лучше обратно на JwaWinCrypt.
да действительно lazarus 1.6.2 c использованием JwaWinCrypt код работает нормально.
а вот времени придется потратить много чтобы перейти на JwaWinCrypt.
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39388591
wlx-plugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
перевод приложения на 64 бит
    #39388650
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlx-plugin
Код: pascal
1.
DetectString: PChar



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

есть PAnsiChar, есть PWideChar

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

ЕМНИП в FPC нынешнем строки вообще UTF-8, то есть не сопадают ни с одним из вариантов string/char/pchar в Deдphi
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39388756
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
перевод приложения на 64 бит
    #39388763
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот морока теперь..
есть системный(или как это называется незнаю) тип 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
перевод приложения на 64 бит
    #39388766
alexer81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторнапильник драчевый ?
попробовал подкинуть Wcrypt2.pas в лазарус - 70 ворнингов типа Wcrypt2.pas(8441,1) Warning: Comment level 3 found и fatal error
я им с 2012 пользуюсь. и за это время многое подправил и добавил. на 32 бита прекрасно всё работало. Один модуль для Delphi7 и Lazarusa
...
Рейтинг: 0 / 0
перевод приложения на 64 бит
    #39388770
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexer81,

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


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