Перейти к содержанию

Рекомендуемые сообщения

Опубликовано
Пожалуйста User только незабуть в uses подключить модуль ShellAPI если раньше этого не сделал

Подключил - всё летает :D хм... только вот с дизайном осталось доработать :D

Еще вопрос:

Решил отказатся от Хелп дока, а решил сделать обычный реадме в тхт расширений, вопрос - можно ли сделать так же кнопку чтобы он открывал текстовый файл который будет лежать рядом с ехе файлом ?

Опубликовано
Еще вопрос:

Решил отказатся от Хелп дока, а решил сделать обычный реадме в тхт расширений, вопрос - можно ли сделать так же кнопку чтобы он открывал текстовый файл который будет лежать рядом с ехе файлом ?

Все таки лучше конечно HTML Help - CHМ, но дело твое. Я только не понял где именно хочешь что бы открывалось твая справка в самой твоей программе например в memo или открывалась в блокноте?

Если в блокноте то аналогично вызову командной строки

WinExec('notepad.exe 1.txt',sw_shownormal);

где 1.txt - файл справки

Опубликовано
Если в блокноте то аналогично вызову командной строки

Да именно так :rolleyes: спасибо :)

 

 

 

Еще вопрос, вот есть окошко т.е. Form1, как сделать чтобы при нажатий на кнопку "Найти файл" - выходило второе окошко Form2 ?

 

WinExec('notepad.exe 1.txt',sw_shownormal);

да и еще вот с помощью команды winexec можно вызывать нотпад или же консоль, а вот fail.bat - который тоже будет лежать рядом с ехе файлом, вызывать его так же можно или нужна другая команда?

Опубликовано (изменено)
Еще вопрос, вот есть окошко т.е. Form1, как сделать чтобы при нажатий на кнопку "Найти файл" - выходило второе окошко Form2 ?

Очень просто в Delphi меню File - New - Form и в обработчики кнопки Найти файл пишешь

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.ShowModal;
end

 

да и еще вот с помощью команды winexec можно вызывать нотпад или же консоль, а вот fail.bat - который тоже будет лежать рядом с ехе файлом, вызывать его так же можно или нужна другая команда?

Да также

WinExec('fail.bat',sw_shownormal);

Изменено пользователем kilo
Опубликовано

Раз уж тут про Делфи разговор, тоже хотелось бы кое о чем попросить. Мне нужно побольше информации по написанию и работе с DLLками на Делфи. А то как-то рунет беден на эту информацию, описывается лишь базовый уровень.

Опубликовано

Да нет, инфы вроде достаточно... особенно если учесть, что по этому вопросу (работе с ДЛЛ в делфях) особо и знать-то нечего, кроме типов линковки (статическая/динамическая), 2 штуки апи (LoadLibrary и GetProcAddress), передачи строк (либо PChar, либо String с включением ShareMem) и директивы far :rolleyes:

Опубликовано

Это и у меня есть. Вроде про директиву far, правда, не слышал. Можно подробнее?

 

И еще. Нашел какую-то статью, где управляются объекты из dll. С используемой в примере канвой формы все нормально. А вот с изменением свойств сторонних компонент, в частности SynEdit, во время выполнения на этапе freelibrary ошибка вылазит.

Опубликовано
Вроде про директиву far, правда, не слышал. Можно подробнее?
Стандартная директива объявления процедуры при статической линковке.

 

И еще. Нашел какую-то статью, где управляются объекты из dll. С используемой в примере канвой формы все нормально. А вот с изменением свойств сторонних компонент, в частности SynEdit, во время выполнения на этапе freelibrary ошибка вылазит.
Так надо смотреть, что загружается библиотекой, какие объекты, раздел инициализации... и корректно это выгружать.
Опубликовано
Стандартная директива объявления процедуры при статической линковке.

Ах, это. Тогда понятно.

 

Так надо смотреть, что загружается библиотекой, какие объекты, раздел инициализации... и корректно это выгружать.

Библиотека подключается динамически. В библиотеке функция типа:

function PlugExec(Syn: TSynEdit): Boolean;
begin
 Syn.SelText := WideUpperCase(Syn.SelText);
 Result := True;
end

А код вызова функции из библиотеки примерно такой:

procedure TForm1.PlugExecItemClick(sender: TObject);
var
 PlugExec: function(Syn : TSynEdit): Boolean;
 fHnd: THandle;
begin
 fHnd := LoadLibrary(PChar('C:\test\lib.dll'));
 if fHnd <> 0 then begin 
@PlugExec := GetProcAddress(fHnd, 'PlugExec');
PlugExec(SynEdit1);
//FreeLibrary(fHnd); 
//ставил также FreeLibrary сюда - результат тот же
 end;
 FreeLibrary(fHnd);	
end;

Если закомментить строчку с FreeLibrary, то ошибки нет. Если оставить, как есть, вылетает ошибка.

 

Может надо что-то добавить. Я пока тесно с библиотеками пока не работал, поэтому не знаю.

Опубликовано

1. Что за ошибка?

2. "Косяка" в приведённом коде не вижу. Он может быть в библиотеке. В lib.dpr и связанных модулях есть секции финализации?

Опубликовано

1. Точно текст сообщения не помню. Но что-то типа неправильного чтения памяти по адресу 0x00...

2. Код самой библиотеки:

library Test;

uses
 Windows,
 SysUtils,
 SynEdit;

function PlugExec(Syn: TSynEdit): Boolean;
begin
 Syn.SelText := WideUpperCase(Syn.SelText);
 Result := True;
end;

exports
 PlugExec;

begin
end.

Опубликовано

Ta2i4 а что в самом модуле SynEdit? :rolleyes:

 

Совет: для функции PlugExec в качестве параметра передавать не объект (TSynEdit), а указатель на него (^TSynEdit).

 

Для проверки вставь в библиотеку функцию вида "function xxx (dummy:byte): boolean; begin messagebeep (не помню параметры) end;", убери из модулей синэдит и проверь её вызов. Если ошибки не будет - значит дело в синэдите 8)

Опубликовано (изменено)
Ta2i4 а что в самом модуле SynEdit? :good:

Это VCL-компонент :)

 

для функции PlugExec в качестве параметра передавать не объект (TSynEdit), а указатель на него (^TSynEdit).

Попробую

 

Если ошибки не будет - значит дело в синэдите 8)

Вызов функций такого рода нормальный. Наверно все-таки компонент такой противный, хочет, чтобы им только из самого приложения издевались.

Изменено пользователем Ta2i4

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...