Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2009, 00:24   #1
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию Создать ini-файл с помощью dll


Ээ... в полной рекурсии я
Задача: написать dll, в ней функцию создания ini-файла.(Hello World)
Длл я "наклепал", если не сказать больше:
Код:
library ini;
uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,inifiles, StdCtrls, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdPOP3, IdBaseComponent, IdMessage;
  function GetIni(ini: Tinifile): Tinifile; stdcall;
  var
  Application: TApplication;
  begin

  ini:=TiniFile.Create(extractfilepath(Application.exeName)+ 'setting.ini');
  ini.WriteInteger('Postal_Server_Port','smtp',25);
  ini.WriteInteger('Postal_Server_Port','pop3',110);
  ini.Free;

  //---
  end;
  exports GetIni;
{$R *.res}

begin
end.
сам запуск(?) функции из длл:
Код:
var
  Form1: TForm1;
  LibHandle: THandle;
function GetIni(ini: TiniFile): PChar;stdcall;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ini: Tinifile;
begin
ini:=Tinifile.Create(extractFilePath(application.ExeName)+'setting.ini');
LibHandle:=LoadLibrary('ini.dll');
if LibHandle>=32 then
   begin
   showMessage('Библиотеку нашли');//тут все ок, сообщение есть
  @GetIni:=GetProcAddress(LibHandle,'GetIni');//тут по пальцам: left side cannot assigned to

//
end;
    end;
end.
PS- первый раз с длл пробую, примеры с форума идут влет, все ок, а здесь гдето накосячил я.
Посмотрите, люди, пжлста.
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 24.08.2009, 14:01   #2
Eofol
Пользователь
 
Аватар для Eofol
 
Регистрация: 20.12.2007
Сообщений: 15
По умолчанию

а если попробовать так:

Код:
var
  Form1: TForm1;
  LibHandle: THandle;
  GetIni: function (ini: TiniFile): PChar; stdcall;
// дальше по тексту.......
проблема в том что нельзя присваивать какое-то значение самой функции, нужно присваивать его переменной типа "функция"
Eofol вне форума Ответить с цитированием
Старый 24.08.2009, 14:05   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
procedure GetINI(INI:TINIFile);stdcall;
begin
 INI.WriteInteger('Postal_Server_Port','smtp',25);
 INI.WriteInteger('Postal_Server_Port','pop3',110);
end;
переписал на процедуру потому что у вас не было реззультата.(считаю что освобождать должна сама программа а не модуль)
а зачем юзес такой большой?

и применение:
Код:
type
 TGetINIProc=procedure GetIni(FilePath:Pchar);

var 
 Form1:TForm1;
 GetINI:TGetINIProc;

implemenation

procedure TForm1.Button1Click(Sender: TObject);
var INI: TINIFile;
begin
 INI:=Tinifile.Create(extractFilePath(application.ExeName)+'setting.ini');
 LibHandle:=LoadLibrary('ini.dll');
 if LibHandle>=32 then
   begin
    showMessage('Библиотеку нашли');
    GetIni:=GetProcAddress(LibHandle,'GetINI');
   end;
 GetINI(INI);
 INI.Free;
end;

end.
чтото типо того.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.08.2009, 16:27   #4
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

Спасибо, товарищи, за ответ.
>юзес такой большой? -- дык ошибку выдал сразу, я и накидал ему, кушай мол все
изначально вся задача такова:
написать длл для отправки с ее помощью почты на заданные адреса. по событию, конечно. и настройки для отправки сохранять в ini-файле. И использовать эту библиотеку в программе, написанной на Си.
Ну что же, начало есть, а с Вами я точно разберусь .
Всем откликнувшимся действительно спасибо!

добился таки создания файла. Возможно несколько криво и некорректно, но:

на форме есть кнопка, мемо1.
dll:
Код:
library post;

{ }

uses
  SysUtils,
  inifiles,
  Dialogs,
  StdCtrls,
  Classes;

Procedure GetINI(INI:TINIFile);stdcall;//обьявили что длл будет использоваться всеми подряд :)
    begin
      INI.WriteInteger('Postal_Server_Port','smtp',25);
      INI.WriteInteger('Postal_Server_Port','pop3',110);
     end;

   exports GetINI; // тут сказали что процедурка внешняя?
{$R *.res}

begin
end.
------------------------------
project1:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,inifiles;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);//ну тут по клику по батону назначить процедуру mess,для того и сделал.
    procedure mess(Sender: TObject);

//    procedure GetINI(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  LibHandle: THandle;
  GetINI:procedure(ini:Tinifile);stdcall;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 //--------
end;
procedure TForm1.mess(Sender: TObject);
 var
  ini:TiniFile;
 begin
  LibHandle:=LoadLibrary('post.dll');// мы знаем как называется длл
  if LibHandle>= 32 then // если она нашлась(длл)
   begin
    memo1.Lines.Add('Библиотеку post.dll нашли, подключились...');// сказали об этом в мемо
  @GetINI:=GetProcAddress(LibHandle,'GetINI');// есть в этой длл процедурка "GetINI"
  INI:=Tinifile.Create((application.ExeName)+'setting.ini');//параметр функции: создать ини с именем екзе+сеттинг
  GetINI(ini);//выполняем процедуру из длл с параметром выше
   end;// бац! в директории, где экзешник, есть ini-файл с параметрами. ура!
 end;

end.
криво конечно,
осталось "прикрутить" много параметров получения-отправления почты и чтение ini в программу. А как обзывать параметры, необходимые для отправки почты?? просто добавить в параметр 'Postal_Server_Port' еще опции? как не обманутся с названием их, т.к. после длл будут юзать на С++ ? без разницы совершенно или как? вопросов тьма
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".

Последний раз редактировалось Stilet; 26.08.2009 в 07:55.
bush007 вне форума Ответить с цитированием
Старый 02.09.2009, 02:35   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

имена переменных не сохраняются...
поэтому важен порядок и тип переменных

Цитата:
вопросов тьма
задавай
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 02.09.2009 в 02:37.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.09.2009, 14:24   #6
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

ок, я решил начать по-немногу.
пусть я создам ини-файл с помощью длл, и прочитаю две строки из ини-файла опять же с помощью длл:

dll
Код:
library postal;
uses
----------
Procedure GetINI(INI:TINIFile);stdcall;//пишем ini
    begin
      INI.WriteString('Postal_Server_Port','smtp','25');
      INI.WriteString('Postal_Server_Port','pop3','110');
     end;
Procedure ReadINI(INI:TINIFile;x,y:string);stdcall;
    begin
      x:=INI.ReadString('Postal_Server_Port','smtp','25');
      y:=INI.ReadString('Postal_Server_Port','pop3','110');
     end;
   exports GetINI,ReadINI; //
{$R *.res}
begin
end.
пишем- читаем:

Код:
var
  Form1: TForm1;
  LibHandle: THandle;
  GetINI:procedure(ini:Tinifile);stdcall;
  ReadINI:procedure(ini:Tinifile;x,y:string);stdcall;
  ini:TiniFile;
 // OpenDialof1:TOpenDialog;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);//пишем ини, все работает
 begin
 if OpenDialog1.Execute then
  begin
  LibHandle:=LoadLibrary('postal.dll');// мы знаем как называется длл
  if LibHandle>= 32 then // если она нашлась(длл)
   begin
    memo1.Lines.Add('Библиотеку postal.dll нашли, подключились...');// сказали об этом в мемо
  @GetINI:=GetProcAddress(LibHandle,'GetINI');
  INI:=Tinifile.Create(OpenDialog1.FileName+'.ini');
  GetINI(ini);
   end;//
 end;
 FreeLibrary(LibHandle);
 end;

procedure TForm1.Button2Click(Sender: TObject);//читаем ини, ошибка
var x,y:string;
begin
  if OpenDialog1.Execute then
    begin
    INI:=Tinifile.Create(OpenDialog1.FileName);
      LibHandle:=LoadLibrary('postal.dll');
      if LibHandle >= 32 then
        begin
        memo1.Lines.Add('Библиотеку postal.dll нашли, подключились...');//все ок,
        @ReadINI:=GetProcAddress(LibHandle,'ReadINI');

        memo1.Lines.Add('Файл нашли');
        sleep(500);
        ReadINI(ini,x,y);
        Memo1.Lines.Add('--------------');
        sleep(1000);
        memo1.Lines.Add(x);//тут зависаем напрочь,"Слишком много исключений"
end;
 end;
  end;
end.
sleep и вывод в memo1 поставил специально, что бы найти момент останова.
мне хотя бы вывести в мемо значение "Х", что бы убедиться о работоспособности . подозреваю что типы переменных не те?
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 02.09.2009, 14:44   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

используй PChar.
вот основные проблемы твои а не стринг.

не просто так же Дельфи пишет:
Цитата:
{ 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.
тем более раз ты для С либу пишешь...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.09.2009, 14:54   #8
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

используй PChar.----
где именно?
Код:
Procedure ReadINI(INI:TINIFile;x,y:PChar);stdcall;
в dll?
или
Код:
ReadINI:procedure(ini:Tinifile;x,y:PChar);stdcall; ?
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 02.09.2009, 15:04   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну если меняем в ДЛЛ то меняем и в проге.

переход к стринг это например:
Код:
memo1.Lines.Add(StrPas(x));
где x:PChar;

и лучше прибирать строки за собой когда они(PChar строки) не нужны
Код:
StrDispose(x);
З.Ы.:обертку к классу TINIFile пишешь?
как то странно немного если честно(на мой взгляд)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 02.09.2009 в 15:14.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.09.2009, 15:08   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
INI:TINIFile
Если ты будеш эту ДЛЛ в Си использовать то с Борландовскими классами могут быть проблемы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TShortCut и INI-файл Sd.Ghost Общие вопросы Delphi 4 07.04.2011 22:32
ini файл cheef Общие вопросы Delphi 5 28.04.2009 07:36
RichView и ini файл KWN, lnc Компоненты Delphi 0 10.02.2009 09:21
ini Файл Volkogriz Общие вопросы Delphi 1 12.11.2008 13:44
ini файл Simply-Art Общие вопросы Delphi 3 17.06.2007 14:43