Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько вопросов о DLL, подскажите 
V
    Опции темы
Foley
Дата 13.3.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: нет
Всего: 7



Несколько вопросов про DLL:
1. Как мне подмтавить в ДЛЛ свое значение? (см. код)
2. Что за ошибка выскакивает при использовании String в ДЛЛ: Invalid pointer operation?
Теория:
3. Чем отличается статистическая загрузка от динамической?
4. Преимущества использования ДЛЛ.
5. Операторы ДЛЛ (или как правильно называются) типа stdcall, far и т.п. с описанием на русском языке.
3, 4, 5 если можно дайте ссылки, только чтоб там понятно описано было.

код ДЛЛ
Код

library Pr_dll;

uses
  SysUtils,
  Classes;

{$R *.res}

function ResultCalcDouble(r: real): Real; stdcall;
begin
Result:=r*2;// сюда подставить значение из программы
end;

function GetString: string;
begin
Result := 'Привет из DLL!' ;
end;


exports
ResultCalcDouble,
GetString;
begin
end.


код юниты:
Код

implementation

{$R *.dfm}
 function ResultCalcDouble(r: real): real; stdcall; external 'Pr_dll.dll';
 function GetString: string; far; external 'Pr_dll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
ResultCalcDouble(StrToFloat(edit1.Text));
label1.Caption:=FloatToStr(ResultCalcDouble(10.5));// всегда возвращает 21
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MessageDlg(GetString, mtInformation, [ mbOK ], 0 )// выдает сообщение и после него ошибку описанную выше
end;

PM MAIL ICQ   Вверх
Alexeis
Дата 13.3.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата

Что за ошибка выскакивает при использовании String в ДЛЛ: Invalid pointer operation?


после создания dll появляетя текст
Цитата

ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results

который говорит о том что нужно подключить модуль ShareMem
для передачи строк в качестве параметров и получения их в виде результата(для экспортируемых функций)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Matematik
Дата 13.3.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 1
Всего: 50



1. Уточни вопрос
2. Когда создаеь DLL там написано
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

т.е. чтобы использовать тип string надо добавить в uses проекта программы и dll модуль ShareMem (поставить его первым), плюс к этому нужна еще dll BORLNDMM.DLL
а вообще лучше вместо String использовать PChar
3. Статист. загружается при старте программы, выгружается с ней вместе
динамическая - сам отвечаешь за загрузку и выгрузку
4. написание плугинов и тд и тп
5. Есть такая вещь как поиск. ya.ru rambler.ru итд
http://ad.cctpu.edu.ru/SSP/Prof/Glava28/Index4.html а там Далее Далее ...

PM MAIL WWW ICQ   Вверх
Alexeis
Дата 13.3.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Цитата

3. Чем отличается статистическая загрузка от динамической?

Статическую не нужно ни загружать ни выгружать.
Динамическая загрузка подразумевает не только загрузку и выгрузку но и определение адресов используемых функций
Заморочки много а эффект есть если используются много разных
библиотек и требуются они в разное время работы программы
или редко. Например при создании плагинов.
Грузится в начале ядро а библиотеки по мере необходимости.

Хороший пример статической загрузки это ядро (kernel.dll ,gdi.dll и тд )windows, которое грузится автоматически при запуске любой программы на delphi (или почти любой).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 13.3.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 4
Всего: 111



Цитата(alexeis1 @ 13.3.2006, 14:28 Найти цитируемый пост)
kernel.dll ,gdi.dll и тд

Странные какие то у тебя dll'ки smile Что за система?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 13.3.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459



Yanis, ладно уже ошибся чуток. Вот более точно
advapi32 = 'advapi32.dll';
kernel32 = 'kernel32.dll';
mpr = 'mpr.dll';
version = 'version.dll';
comctl32 = 'comctl32.dll';
gdi32 = 'gdi32.dll';
user32 = 'user32.dll';



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 13.3.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 4
Всего: 111



alexeis1,
Не в обиду сказано ;)


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Foley
Дата 13.3.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: нет
Всего: 7



Цитата(Matematik @ 13.3.2006, 14:22 Найти цитируемый пост)
Уточни вопрос

ну вот
Код

function ResultCalcDouble(r: real): Real; stdcall;    
begin    
Result:=r*2;// r:=StrToFloat(Edit1.Text) т.е. подставить заместо "р" значение из программы    
end;

и воопще возможно ли это?

Со вторым вопросом я разобрался...3, 4 понял объяснение

а вот про stdcall по ссылке ниче не понятно, но все равно спасибо smile
Добавлено @ 23:12
ой поторопился
Цитата(Foley @ 13.3.2006, 23:10 Найти цитируемый пост)
а вот про stdcall по ссылке ниче не понятно, но все равно спасибо

понял все...

PM MAIL ICQ   Вверх
Foley
Дата 15.3.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фсемба Яцца
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 31.1.2006
Где: Россия, Арх.обл

Репутация: нет
Всего: 7



все понял сам где собака зарыта:
Код

procedure TForm1.Button1Click(Sender: TObject);    
begin    
ResultCalcDouble(StrToFloat(edit1.Text));    
label1.Caption:=FloatToStr(ResultCalcDouble(10.5));    
end;

а надо было:
Код

procedure TForm1.Button1Click(Sender: TObject);    
begin    
label1.Caption:=FloatToStr(ResultCalcDouble(StrToFloat(edit1.Text)));
end;

правильно говроится, что чем глупее ошипка тем труднее ее найти... smile

Всем спасибо...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1893 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.