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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2009, 22:52   #1
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию Импорт из С dll на Дельфи

Здраствуйте. Подскажите, как мне правильно импортировать функцию из C++ библиотеки в свою прогу на Дельфи?

Функция С++:
int ox_GetMM(LBtn& loc);

Импортирую:
function ox_GetMM(loc: LBtn): Integer; дальше импорт и все такое...

Загвоздка в том, что получаю 0 от функции, значит ошибка, плюс не могу получить данные из записи LBtn. Как тут поступить? Спасибо.
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 17.11.2009, 03:15   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

там вроде var нужен
Код:
function ox_GetMM(var loc: LBtn): Integer;external <имя ДЛЛ>;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.11.2009, 03:33   #3
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Я немного продвинулся вперед сам, и сейчас все, что не выходит - это непонятка с указателями на запись с библиотеки, как узнать содержимое записи?

Структуру (запись) объявляю так:
Код:
type
  PLBtn = ^LBtn;
  LBtn = packed record
    ...
  end;

  ...

  function MM(lk: PLBtn): Integer; stdcall; external MMDLLFile;
Мне вот по щелчку на кнопке нужно вывести содержимое поля записи LBtn. Что записать в обработчик?
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты

Последний раз редактировалось apromix; 17.11.2009 в 03:41. Причина: Добавил пример
apromix вне форума Ответить с цитированием
Старый 17.11.2009, 03:35   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если делали через var то как обычно.
если через указатель то надо его разименовывать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.11.2009, 03:39   #5
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Я добавил пример, подскажите,как разименовать указатель?
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 17.11.2009, 03:49   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
type
 PMy=^TMy;
 TMy=record
  i:integer;
  s:PChar;
 end;

var M:PMy;

New(M);
M^.i:=1024;//это главное.
Dispose(M);
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.11.2009, 04:05   #7
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Это я уже понял, а как с С++ DLL импортировать function MM(lk: PLBtn): Integer; stdcall; external MMDLLFile и узнать содержимое записи PLBtn (есть указатель на нее)?

Мне вот по щелчку на кнопке нужно вывести содержимое поля записи LBtn. Что записать в обработчик?

Постоянно выбивают ошибки с памятью. Если пишу function MM(var lk: PLBtn)..., то ошибки нет, но не работает. Или var здесь нельзя использовать?
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты

Последний раз редактировалось apromix; 17.11.2009 в 04:07.
apromix вне форума Ответить с цитированием
Старый 17.11.2009, 04:21   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

Код:
function MM(lk: PLBtn): Integer; stdcall; external MMDLLFile
ваша функция называется MM?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.11.2009, 10:52   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

В сишных библиотеках обычно модель вызова cdecl, а не stdcall
пыщь
JTG вне форума Ответить с цитированием
Старый 17.11.2009, 11:26   #10
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Так, я тут многое понял с указателями, но ошибки все равно получаю.

C++ H:

Код:
...
struct QBoxLocBtn {
	int id;				// ID кнопки для GetButton(), локации для GetLocation()
	int bcnt;			// GetLocation() возвращает кол-во кнопок для данной локации; 
	int flag;			// GetButton() возвращает flag (if flag==1, then button - visible)
	int tag;			// AddLocation(), AddButton(): 
						//	if tag == 1 then <есть скрипт> 
						//	if tag == 0 then <нет скрипта>
	char define[DEFINE_SIZE];	// Описание локации(кнопки)
	char name[NAME_SIZE];		// Название локации (кнопки)
	char script[SCRIPT_SIZE];	// Скрипт локации (кнопки)
};
...
QBOX_API int qbox_GetLocation(QBoxLocBtn& qb_loc);
...
Delphi:

Код:
unit untQBoxImportFromDLL;

interface

type
  PQBoxLocBtn = ^QBoxLocBtn;
  QBoxLocBtn = packed record
    id        : Integer; // ID кнопки для GetButton(), локации для GetLocation()
    bcnt      : Integer; // GetLocation() возвращает кол-во кнопок для данной локации;
    flag      : Integer; // GetButton() возвращает flag (if flag==1, then button - visible)
    tag       : Integer; // AddLocation(), AddButton():
		  				           //	if tag == 1 then <есть скрипт>
                         //	if tag == 0 then <нет скрипта>
    define    : PChar;   // Описание локации(кнопки)
    name      : PChar;   // Название локации (кнопки)
    script    : PChar;   // Скрипт локации (кнопки)
  end;

const QBoxDLLFile = 'QBox.dll';

function qbox_Init: Integer; stdcall; external QBoxDLLFile;
procedure qbox_Quit; stdcall; external QBoxDLLFile;

function qbox_LoadQuest(const fname: PChar): Integer; stdcall; external QBoxDLLFile;

function qbox_GetLocation(qb_loc: PQBoxLocBtn): Integer; cdecl; external QBoxDLLFile;
function qbox_GetLocCnt: Integer; stdcall; external QBoxDLLFile;


function qbox_GetButCnt(lid: Integer): Integer; stdcall; external QBoxDLLFile;

function qbox_GetVersion: PChar; stdcall; external QBoxDLLFile;
function qbox_GetAuthors: PChar; stdcall; external QBoxDLLFile;

implementation

end.
И уже в самой программе:

Код:
...
procedure TfrmQBoxMain.Init1Click(Sender: TObject);
var
  QA: PQBoxLocBtn;
  QB: QBoxLocBtn;
begin
  qbox_Init;
  qbox_LoadQuest(PChar('Island.qbf'));
//  New(QA);
//  QA^.name := PChar('SERG');
  ShowMessage('GetLocation: ' + IntToStr(qbox_GetLocation(QA)));
//  ShowMessage(StrPas(QA^.name));
  ShowMessage(StrPas(QB.define));
  Dispose(QA);
end;
...
Что я делаю не так? Выбивает: Invalid pointer operation.
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
С++: правильный импорт dll apromix Помощь студентам 1 04.10.2009 02:28
Запуск Load.dll (бывшая Load.exe) в дереве проц-ов, Как запустить прогой на C# .dll-ку kapustin Общие вопросы .NET 10 23.09.2009 22:20
Импорт DLL в прогу cowboy Общие вопросы Delphi 5 14.04.2009 13:37
Импорт VB6 DLL в C++ DmF Общие вопросы C/C++ 1 06.03.2008 08:48