Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Использование DLL   Найти похожие ветки 

 
HBZ ©   (2006-05-09 18:35) [0]

Здравствуйте!
У меня есть DLL написанная на С-билдере и я пытаюсь к ней обратиться, но столкнулся с проблемой. Вот мой код:
unit test;

interface

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

type
 DWORD = Longword;
 TSome_func = function(p1: DWORD; p2:Pointer; var p3: Pointer) :DWORD; cdecl;

 TForm1 = class(TForm)
   msg: TLabel;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
 LibHandle: HModule;
 Some_Func : TSome_Func;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

LibHandle := LoadLibrary("my.dll");
if (LibHandle<>0) then begin
 @Some_Func := GetProcAddress(LibHandle, "Some_Func");
 if (@Some_Func <> nil) then msg.Caption := "OK"
                             else msg.Caption := "Error";
end;

Эту библиотеку писал не я, но я знаю (судя по прилагающемуся хелпу), что там должна быть функция Some_Func, объявленная следующим образом:

extern "C" DWORD Some_Func(
DWORD  p1;
void *p2;
void *p3)


где DWORD
typedef unsigned long DWORD

Так вот: при запуске программы значение поля Caption метки msg становится равным Error, из чего я делаю вывод, что библиотека загружается нормально, но нужная мне функция не найдена. Вопрос: эта моя ошибка в коде или этой функции просто нет в библиотеке? Можно ли как-нить посмотреть внутренности этой длл?


 
KilkennyCat ©   (2006-05-09 18:38) [1]


> Можно ли как-нить посмотреть внутренности этой длл?


F3


 
Шпиён   (2006-05-09 18:46) [2]

TDump


 
KilkennyCat ©   (2006-05-09 18:47) [3]


>  [2] Шпиён   (09.05.06 18:46)


По F3 быстрее. По крайней мере, для
> или этой функции просто нет в библиотеке?


 
icWasya ©   (2006-05-10 09:51) [4]

и в догонку - а правильно ли объявлен прототип функции

extern "C" DWORD Some_Func(DWORD  p1;void *p2;void *p3);
это
function(p1: DWORD; p2:Pointer; p3: Pointer) :DWORD; cdecl
а не
function(p1: DWORD; p2:Pointer; var p3: Pointer) :DWORD; cdecl


 
palva ©   (2006-05-10 10:31) [5]

Прототип объявлен правильно. Но с именем функции могут быть проблемы. Надо точно знать, какое имя экспортирует DLL. Возможно, в паскале перед именем функции придется добавить подчеркивание. Как уже советовали, можно сделать tdump или посмотреть в блокноте саму dll.



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
8-1134388588
Ботвин Дмитрий
2005-12-12 14:56
2006.05.28
Несколько звуковых карт


2-1144831613
serko
2006-04-12 12:46
2006.05.28
WebBrowser


4-1141637653
kay
2006-03-06 12:34
2006.05.28
Как mdichild форму сделать toolwindow?


3-1143802532
pmy482
2006-03-31 14:55
2006.05.28
QReport - не забывает старые данные, дублирует


2-1147245283
Id
2006-05-10 11:14
2006.05.28
Пользователи базы данных