Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров
0/0

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Уважаемые читатели!
Тут можно читать бесплатно Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров. Жанр: Программирование. Так же Вы можете читать полную версию (весь текст) онлайн книги без регистрации и SMS на сайте Knigi-online.info (книги онлайн) или прочесть краткое содержание, описание, предисловие (аннотацию) от автора и ознакомиться с отзывами (комментариями) о произведении.
Описание онлайн-книги Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров:
…начиная с 1001. Смотрите другие файлы…
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 105 106 107 108 109 110 111 112 113 ... 123

    Height = 21

    DataField = 'Area'

    DataSource = DataSource1

    MaxLength = 0

    TabOrder = 3

   end

   object EditPopulation: TDBEdit

    Left = 6

    Top = 173

    Width = 65

    Height = 21

    DataField = 'Population'

    DataSource = DataSource1

    MaxLength = 0

    TabOrder = 4

   end

  end

 end

 object DataSource1: TDataSource

  Left = 95

  Top = 177

 end

 object Database1: TDatabase

  DatabaseName = 'DB1'

  LoginPrompt = False

  SessionName = 'Default'

  Left = 128

  Top = 176

 end

end

Как вызывать функцию 16-битной DLL из 32-битного приложения?

Из советов Nomadic'a:

Надо использовать Thunks.

Кусок работающего только под Windows 95 кода —

const

 Gfsr_SystemResources = 0;

 Gfsr_GdiResources = 1;

 Gfsr_UserResources = 2;

var

 hInst16: THandle;

 GFSR: Pointer;

 { Undocumented Kernel32 calls. }

function LoadLibrary16(LibraryName: PChar): THandle; stdcall; external kernel32 index 35;

procedure FreeLibrary16(HInstance: THandle); stdcall; external kernel32 index 36;

function GetProcAddress16(Hinstance: THandle; ProcName: PChar): Pointer; stdcall; external kernel32 index 37;

procedure QT_Thunk; cdecl; external kernel32 name 'QT_Thunk';

{ QT_Thunk needs a stack frame. }

{$StackFrames On}

{ Thunking call to 16-bit USER.EXE. The ThunkTrash argumentallocates space on the stack for QT_Thunk. }

function NewGetFreeSystemResources(SysResource: Word): Word;

var ThunkTrash: array[0..$20] of Word;

begin

 { Prevent the optimizer from getting rid of ThunkTrash. }

 ThunkTrash[0] := hInst16;

 hInst16 := LoadLibrary16('user.exe');

 if hInst16 < 32 then raise Exception.Create('Can''t load USER.EXE!');

 { Decrement the usage count. This doesn't really free the library, since USER.EXE is always loaded. }

 FreeLibrary16(hInst16);

 { Get the function pointer for the 16-bit function in USER.EXE. }

 GFSR := GetProcAddress16(hInst16, 'GetFreeSystemResources');

 if GFSR = nil then raise Exception.Create('Can''t get address of GetFreeSystemResources!');

 { Thunk down to USER.EXE. }

 asm

  push SysResource { push arguments }

  mov edx, GFSR { load 16-bit procedure pointer }

  call QT_Thunk { call thunk }

  mov Result, ax { save the result }

 end;

end

Как написать DLL, которую можно было-бы выполнить с помощью RunDll, RunDll32?

Из советов Nomadic'a :

Вы должны определить в программе вызываемую снаружи функцию.

Функция должна быть __stdcall (или WINAPI, что то же самое ;)) и иметь четыре аргумента. Первый – HWND окна, порождаемого rundll32 (можно использовать в качестве owner'а своих dialog box'ов), второй – HINSTANCE задачи, третий – остаток командной строки (LPCSTR, даже под NT), четвертый – не знаю ;).

Hапример –

int __stdcall __declspec(dllexport) Test (HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy) {

 MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK);

 return 0;

}

Исполняем таким образом –

rundll32 test.dll,[email protected] this is a command line

выдаст message box со строкой «this is a command line».

На Паскале –

Function test(hWnd: Integer; hInstance: Integer; lpCmdLine: PChar; dummy: Longint): Integer; StdCall; export;

begin

 Windows.MessageBox(hWnd, lpCmdLine, 'Command Line', MB_OK);

 Result := 0;

end;

Давненько я ждал эту информацию! Сел проверять и наткнулся на очень забавную вещь. А именно – пусть у нас есть исходник на Си пpимерно такого вида:

int WINAPI RunDll(HWND hWnd, HINSTANCE hInstance, LPCSTR lpszCmdLine, DWORD dummy);

……

int WINAPI RunDllW(HWND hWnd, HINSTANCE hInstance, LPCWSTR lpszCmdLine, DWORD dummy);

……

и .def-файл примерно такого вида:

EXPORTS

RunDll

RunDllA=RunDll

RunDllW

то rundll32 становится разборчивой — под NT вызывает UNICODE-версию. Под 95, разумеется, ANSI.

Продукты третьих фирм 

Adobe 

Читаем Adobe Acrobat PDF файлы из нашего приложения

Igor Nikolaev aKa The Sprite советует:

Adobe Acrobat PDF — хорошо известный формат, который нравится многим пользователям. Давайте посмотрим, как можно заставить приложение на Delphi прочитать файл такого формата.

Совместимость: Delphi 3.x (или выше)

Итак, Вы должны быть уверены, что у вас проинсталлирован Acrobat Reader, если таковой программы нет, то её можно скачать с www.adobe.com После этого необходимо проинсталировать типовую библиотеку для Acrobat (Project→Import Type Library из меню Delphi) выберите "Acrobat Control for ActiveX (version x)". Где x — текущая версия библиотеки. Hажмите кнопку инсталяции. Теперь создайте новое приложение, поместите на форму проинсталлированный компонент TPDF, далее добавите OpenDialog, и в заключении кнопку, при на нажатии на которую будет вызываться процедура открытия файла:

procedure TForm1.Button1Click(Sender: TObject);

begin

 if OpenDialog1.Execute then pdf1.src := OpenDialog1.FileName;

end;

в юните PdfLib_TLB вы можете найти интерфейс класса TPdf:

TPdf = class(TOleControl)

private

 FIntf: _DPdf;

 function  GetControlInterface: _DPdf;

protected

 procedure CreateControl;

 procedure InitControlData; override;

public

 function  LoadFile(const fileName: WideString): WordBool;

 procedure setShowToolbar(On_: WordBool);

 procedure gotoFirstPage;

 procedure gotoLastPage;

 procedure gotoNextPage;

 procedure gotoPreviousPage;

 procedure setCurrentPage(n: Integer);

 procedure goForwardStack;

 procedure goBackwardStack;

 procedure setPageMode(const pageMode: WideString);

 procedure setLayoutMode(const layoutMode: WideString);

 procedure setNamedDest(const namedDest: WideString);

 procedure Print;

 procedure printWithDialog;

 procedure setZoom(percent: Single);

 procedure setZoomScroll(percent: Single; left: Single; top: Single);

 procedure setView(const viewMode: WideString);

 procedure setViewScroll(constviewMode: WideString; offset: Single);

 procedure setViewRect(left: Single; top: Single; width: Single; height: Single);

 procedure printPages(from: Integer; to_: Integer);

 procedureprintPagesFit(from: Integer; to_: Integer; shrinkToFit: WordBool);

 procedure printAll;

 procedure printAllFit(shrinkToFit: WordBool);

 procedure setShowScrollbars(On_: WordBool);

 procedure AboutBox;

 property ControlInterface: _DPdf read GetControlInterface;

 property DefaultInterface: _DPdf read GetControlInterface;

published

 property TabStop;

 property Align;

 property DragCursor;

 property DragMode;

 property ParentShowHint;

 property PopupMenu;

 property ShowHint;

 property TabOrder;

 property Visible;

 property OnDragDrop;

 property OnDragOver;

 property OnEndDrag;

 property OnEnter;

 property OnExit;

 property OnStartDrag;

 property src: WideString index 1 read GetWideStringProp write SetWideStringProp stored False;

end;

в заключение можно добавить следующее: Если Вы не уверены, что у конечного пользователя Вашей программы установлен Acrobat Reader, то необходимо, чтобы приложение проверяло эту ситуацию, прежде чем будут производится различные манипуляции с компонентой TPdf. И второе, если файл PDF имеет различные связи, например с AVI файлами, то они не будут работать из Delphi.

Надеюсь этот пример будет Вам полезен. 

Vista Software Apollo 

Какие есть рекомендации по использованию Apollo SDE?

Nomadic советует: 

1. При работе с Аполло (если у тебя базы используются и досовскими задачами) — то в dbgrid'e поставь значение Font→Charset = OEM_Charset. И не забудь сразу после открытия базы вызывать метод Apollo1.SetTranslate(True). Если твое приложение будет работать с базами одновременно с досовскими, то советую перед открытием баз вызывать метод Apollo1.SysProp(SDE_SP_SETOBUFFER, Pointer(0)); для отключения буферизации операций чтения/записи в базы.

2. Если ты пишешь приложение, которое будет использовать базы только в кодировке Windows (CP1251), то тебе достаточно будет указать в dbgrid'e значение Font→Charset = Russian_Charset. Если базы в 866 кодиpовке, то:

1 ... 105 106 107 108 109 110 111 112 113 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий

Рейтинговые книги