Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Млин, как вызвать функцию из DLL? 
:(
    Опции темы
weiss
Дата 13.2.2003, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.2.2003
Где: Yekat

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



//это объявление
function NetScheduleJobAdd (var Servername:LPWSTR; var Buffer:LPBYTE; var JobId:LPDWORD):NET_API_STATUS; external 'netapi32.dll';

//это переменные
var MYJOB : AT_INFO;
MYJID : DWORD;
ATRES : NET_API_STATUS;
server: array [0..255] of WideChar;
cmd: array [0..1023] of WideChar;
...
тут чёта делаю
...

//это вызов
ATRES:=NetScheduleJobAdd (@server, @MYJOB, @MYJID);

пишет "Types of actual and fromal parameters must be identical"
как ему объяснить, что я передаю то, что нужно?
PM MAIL ICQ   Вверх
SmaLL
Дата 14.2.2003, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(weiss @ 13.2.2003, 11:19)
//это объявление
function NetScheduleJobAdd (var Servername:LPWSTR; var Buffer:LPBYTE; var JobId:LPDWORD):NET_API_STATUS; external 'netapi32.dll';

//это переменные
var MYJOB : AT_INFO;
     MYJID : DWORD;
     ATRES : NET_API_STATUS;
     server: array [0..255]  of WideChar;
     cmd:    array [0..1023] of WideChar;
...
тут чёта делаю
...

//это вызов
    ATRES:=NetScheduleJobAdd (@server, @MYJOB, @MYJID);

пишет "Types of actual and fromal parameters must be identical"
как ему объяснить, что я передаю то, что нужно?

1. В описании параметров функции убери VAR, LPBYTE - это тот же Pointer, т.е. должно быть так:
Код
function NetScheduleJobAdd (Servername:LPWSTR; Buffer:Pointer;  JobId:LPDWORD):NET_API_STATUS; external 'netapi32.dll';


2. Объявление server лучше поменять на
Код
server: WideString;

Так будет проще присваивать ему строку, например
Код
server:= 'PDCServer';


Это сообщение отредактировал(а) SmaLL - 14.2.2003, 00:52


--------------------
Что ни делается - всЁ к лучшему! SmallWeb
Мой адрес не дом и не улица, мой адрес родной пивзавод!
PM MAIL WWW ICQ   Вверх
Unregistered
Дата 14.2.2003, 01:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нельзя передавать адреса переменных как var параметры. Странновато определение этой экспортной функции - обычно имеет место передача указателей, а не адресов указателей.
  Вверх
SmaLL
Дата 14.2.2003, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Unregistered @ 13.2.2003, 17:23)
Нельзя передавать адреса переменных как var параметры. Странновато определение этой экспортной функции - обычно имеет место передача указателей, а не адресов указателей.

Описание правильное, в хелпе WinAPI так и написано, любит Билл брать адреса указателей


--------------------
Что ни делается - всЁ к лучшему! SmallWeb
Мой адрес не дом и не улица, мой адрес родной пивзавод!
PM MAIL WWW ICQ   Вверх
Cashey
Дата 14.2.2003, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


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

Репутация: 2
Всего: 60



Если dll используется как OLE сервер автоматизации, то сначало надо создать переменную типа variant, затем используя ф-цию CreateOleObject создается объект и присваевается этой переменной
Код

uses ComCtrls, ComObj;
var
Registr: Variant;
begin
Registr := createoleobject('nameobject.namefunction');
{теперь работать как с переменной}
Registr.nameparametr := 2;
Edit1.Text := Registr.nameparametr2;
end;

такой сервер существует только в текущем модуле и из др. модулей недоступен.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
weiss
Дата 17.2.2003, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.2.2003
Где: Yekat

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



Нифига, мужики. Можно с варами а можно и без них, вот так:

function NetScheduleJobAdd (var Servername: WideString; var Buffer:BYTE; var JobId:DWORD):NET_API_STATUS; stdcall; external 'netapi32.dll';

или

function NetScheduleJobAdd (Servername: LPWSTR; Buffer:LPBYTE; JobId:LPDWORD):NET_API_STATUS; stdcall; external 'netapi32.dll';


а ошибка была в объявлении:
type
(* это "сишное" описание
typedef struct _AT_INFO {
DWORD_PTR JobTime;
DWORD DaysOfMonth;
UCHAR DaysOfWeek;
UCHAR Flags;
LPWSTR Command;
} AT_INFO, *PAT_INFO, *LPAT_INFO;
конец *)

_AT_INFO = PACKED record
JobTime: DWORD;
DaysOfMonthWORD;
DaysOfWeek: UCHAR;
Flags: UCHAR;
Command: LPWSTR;
end;
AT_INFO = _AT_INFO;
PAT_INFO = ^AT_INFO;
LPAT_INFO = ^AT_INFO;


PACKED писать не надо было в строке PACKED record
PM MAIL ICQ   Вверх
weiss
Дата 17.2.2003, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.2.2003
Где: Yekat

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



теперь всё работает, всем спасибо за внимание.
PM MAIL ICQ   Вверх
Fantasist
Дата 18.2.2003, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
Можно с варами а можно и без них, вот так


Можно. Но передать адрес как var параметр все равно ты не можешь, потому как адрес не является переменной. То есть это не откомпилируется:

Код

procedure ss(var a:PInteger);
begin
end;

procedure proc;
var
 c:integer;
begin
 ss(@c);
end;



Это сообщение отредактировал(а) Fantasist - 18.2.2003, 05:56


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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