![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с DLL
User1 © (2004-11-29 10:43:00)Уважаемые мастера, помогите мне разобраться что не так в dll:
Код DLL:
uses
ShareMem,
SysUtils,
Classes,
winsock;
function LocalIP: string;
type
TaPInAddr=array [0..10] of PInAddr;
PaPInAddr=^TaPInAddr;
var
phe:PHostEnt;
pptr:PaPInAddr;
Buffer:array [0..63] of char;
i:Integer;
GInitData:TWSADATA;
begin
WSAStartup($101, GInitData);
Result:='';
GetHostName(Buffer, SizeOf(Buffer));
phe:=GetHostByName(buffer);
if phe=nil then Exit;
pptr:=PaPInAddr(Phe^.h_addr_list);
i:=0;
while pptr^[i]<>nil do
begin
result:=StrPas(inet_ntoa(pptr^[i]^));
Inc(i);
end;
WSACleanup;
end;
exports LocalIP;
begin
end.
Создаю новый проект. Кидаю в туже папку откомпилированнуб DLL. кидаю на форму Edit и Button.. функцию обьявляю как: function LocalIP:string; stdcall; external 'main1.dll';
в обработчике Button.onClick пишу:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Edit1.Text:=LocalIP;
end;
И в итоге при нажаттии на конпку - вылетает ошибка: "...Invalid pointer operation ....."
Мастера скажите пожалуйста в чем проблема?
icWasya (2004-11-29 14:10:00) [1]>User1 [1] [4]
у тебя в DLL
function LocalIP: string;
а в проекте
function LocalIP:string; stdcall;external 'main1.dll';
нужно соглашения о вызовах делать одинаковыми и в DLL b в проекте
ssk (2004-11-29 11:42:00) [2]а у меня без ShareMem все прекрасно работает:
код DLL:
library net;
uses
WinSock;
function LocalIP: PAnsiChar; stdcall;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
i : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe := GetHostByName(buffer);
if phe = nil then
Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
i := 0;
while pptr^[i] <> nil do
begin
result := inet_ntoa(pptr^[i]^);
Inc(i);
end;
WSACleanup;
end;
exports
LocalIP;
end.
В программе:
var
Form1: TForm1;
function LocalIP: PAnsiChar; stdcall; external 'net.dll';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := LocalIP;
end;
Michael Makushev (2004-11-29 11:37:00) [3]У меня была та же проблема. В чистом проекте Delphi на DLL указано что необходимо юзать ту же библиотеку в первой строке. Если не юзать то все ОК. То есть и со строками работает и с WideString. А если заюзать, то все...сбивает все насмерть
Alexander Panov (2004-11-29 11:33:00) [4]User1 (29.11.04 11:25) [4]
Установил.. теперь нажав на кнопку пишеться айпи, зато когда я закрываю приложение вылазит таже ошибка!
Приведи полностью код библиотеки и код тестового проекта...
User1 (2004-11-29 11:25:00) [5]
> В новом проекте установил в .DPR Uses ShareMem?
Установил.. теперь нажав на кнопку пишеться айпи, зато когда я закрываю приложение вылазит таже ошибка!
Alexander Panov (2004-11-29 11:08:00) [6]User1 (29.11.04 10:56) [2]
В новом проекте установил в .DPR Uses ShareMem?
User1 (2004-11-29 10:56:00) [7]
> Amoeba ©
Отладить можно программу.. а dll как ее можно отладить?
В отладке программы именно ругаеться когда вызываеться функция из dll!
Amoeba (2004-11-29 10:47:00) [8]А для начала провести отладку DLL, чтобы локализовать ошибку в коде, религия не позволяет?