Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборка DLL в C++ Builder 6.0, совместимость с VFP 
:(
    Опции темы
WERITAS
Дата 19.4.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



* Репостинг с форума CodeNet.ru, там чего-то совсем глухо...

Необходимо собрать DLL-библиотеку, функции которой будут использоваться, к примеру, в VFP.

Тестовый пример.
Заголовочный файл:

Код

#ifndef _Unit1_h
#define _Unit1_h
#ifdef __DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif
void DLL_EI __stdcall test();
#endif


Файл реализации:
Код

#include <vcl.h>
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) {
return 1;
}
#include "Unit1.h"
void __stdcall test() {
;
}


Вызов функции из VFP:

Код

declare test in "c:\projects\test\project1.dll"
=test()


Не может найти функцию test (can't find entry point test in DLL).

Смотрим структуру собранной DLL, к примеру, через утилиту impdef:
Код

impdef project1.def project1.dll


Содержимое project1.def:
Код

LIBRARY PROJECT1.DLL

EXPORTS
@test$qv            @1   ; test()
___CPPdebugHook  @2   ; ___CPPdebugHook


Читаю статью, начинаю играть опциями компилятора и линковщика. Изменение опций: calling convention, don't mangle code modifiers - ничего дает, функция все равно с "искаженным" названием.

Проблема именно в доступе к функции из не C-подобного языка. Динамическое связывание DLL-библиотеки на C++ в том же Builder-е работает нормально:
Код

#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#pragma argsused
int main(int argc, char* argv[]) {
void (*test)();
HINSTANCE dllp = LoadLibrary("project1.dll");
if (dllp) {
  test = (void(*) ())
  GetProcAddress(dllp, "_test");
  if (test)
   test();
  else
   printf("test not found.");
}
FreeLibrary(dllp);
return 0;


Уже отчаялся, подскажите, что делаю не так? Заранее благодарен.  


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
_hunter
Дата 19.4.2006, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



если статью читал -- почему extern ”C” не приписал?
и почему динамически грузиш "_test" а в VFP грузиш "test"? 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
WERITAS
Дата 20.4.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


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

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



Цитата

и почему динамически грузиш "_test" а в VFP грузиш "test"?  

При такой сборке символ "_" не добавляется, то есть повсеместно DLL экспортирует функции с полным названием без добавлений. 



extern "C" помогло отключить полиморфизм. В статье проморгал тот абзац... 
_hunter, Спасибо! 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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