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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2010, 03:08   #1
xanrias
Новичок
Джуниор
 
Регистрация: 11.08.2010
Сообщений: 3
Смущение строки в dll

Здравствуйте уважаемые знатоки, хочу задать вопрос по dll в delphi. Вернее хочу увидеть пример кода, задача сдледующая, в библиотеку передаётся строка, обрабатывается функцией и возращается результат, тоже строка, функция выполняется динамически. Казалось бы что проще, но возникает проблема доступа к памяти, поиск по интернету вернул несколько вариантов решения, во первых почитать внимательно комментарий новосозданой dll, да sharemem использовать пробывал, как советуют, строка передаётся, но при выходе из программы всё равно выскакивает ошибка, при использовании pchar, возращаются неверные данные (не имею опыта использования pchar), использовать widestring (брал по примеру на каком то форуме), даёт ошибку памяти сразу при вызове функции, вообщем ответа по различным запросам в поиске я не нашёл, кто может показать рабочий пример кода по моей задаче?

Последний раз редактировалось xanrias; 11.08.2010 в 03:10.
xanrias вне форума Ответить с цитированием
Старый 11.08.2010, 03:19   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Судя по:

Цитата:
Сообщение от xanrias Посмотреть сообщение
использовать widestring ... даёт ошибку памяти сразу при вызове функции
Проблема у вас вовсе не в строках. Скорее всего, напутали в сигнатуре функции.

Показывайте код.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.08.2010, 03:26   #3
xanrias
Новичок
Джуниор
 
Регистрация: 11.08.2010
Сообщений: 3
По умолчанию

Код:
library Project2;

uses ShareMem,SysUtils, Classes;

function info(str:widestring): WideString; stdcall; export;
begin
result:=str+'!';
end;

exports info;
begin
end.
вызов


Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
     Form1: TForm1;
     info:function(s:WideString): WideString;
     LibHandle: THandle;
implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  {"×èñòèì" àäðåñ ôóíêöèè îò "ãðÿçè"}
  @info := nil;
  {Ïûòàåìñÿ çàãðóçèòü áèáëèîòåêó}
  LibHandle := LoadLibrary('project2.DLL');
  {Åñëè âñå OK}
  if LibHandle >= 32 then begin
    {...òî ïûòàåìñÿ ïîëó÷èòü àäðåñ ôóíêöèè â áèáëèîòåêå}
    @info := GetProcAddress(LibHandle,'info');
    {Åñëè è çäåñü âñå OK}
    if @info <> nil then
      {...òî âûçûâàåì ýòó ôóíêöèþ è ïîêàçûâàåì ðåçóëüòàò}
      ShowMessage(info('f'));
  end;
  {È íå çàáûâàåì îñâîáîäèòü ïàìÿòü è âûãðóçèòü DLL}
  FreeLibrary(LibHandle);
end;

end.
а не могли бы ы не оценивая что за бред я там только не писал =) набросать вкратце маленький примерчик?

From Stilet: Попрошу код оформлять спецтегом по кнопке #

Последний раз редактировалось Stilet; 11.08.2010 в 08:01.
xanrias вне форума Ответить с цитированием
Старый 11.08.2010, 05:42   #4
igh0st
Форумчанин
 
Аватар для igh0st
 
Регистрация: 05.07.2010
Сообщений: 136
По умолчанию

В dll

Код:
...
function MyFunction(Str: WideString): WideString; stdcall;
exports MyFunction;

implementation

{$R *.dfm}

function MyFunction(Str: WideString): WideString; stdcall;
begin
  // Текст тела функции
end;
В модуле формы
Код:
...
var
  MyFunction: function(Str: WideString): WideString; stdcall;

implementation

...

procedure TForm.Button1OnClick(Sender: TObject)
var
  LibraryHnd: THandle;
  MyFuncResult: WideString;
begin
  MyFuncResult := '';
  LibraryHnd := LoadLibrary('mylib.dll');
  try
    if LibraryHnd <> 0 then
      begin
        MyFunction := GetProcAddress(LibraryHnd, 'MyFunction');
        if Assigned(MyFunction) then
          MyFuncResult := MyFunction('Hello, world!');
      end;
  finally
    FreeLibrary(LibraryHnd);
  end;
  ShowMessage(MyFuncResult);
end;
...
igh0st вне форума Ответить с цитированием
Старый 11.08.2010, 19:04   #5
xanrias
Новичок
Джуниор
 
Регистрация: 11.08.2010
Сообщений: 3
По умолчанию спасибо

Спасибо всем кто помог! да пример рабочий, но при выходе из программы вылетает всё таже ошибка памяти, вот ребята на другом форуме подсказали http://www.cyberforum.ru/delphi-begi...tml#post899869
xanrias вне форума Ответить с цитированием
Старый 11.08.2010, 19:05   #6
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 11.08.2010 в 20:08.
chertovich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пытаюсь понять код user32.dll и gdi32.dll Beermonza Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 43 13.07.2010 15:09
Windows I/o без Kernel32.dll и Advapi32.dll coinkrsk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 31 27.06.2010 08:52
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
Передать строки из dll в программу 856100 Общие вопросы Delphi 6 03.08.2009 00:37