Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите пожалуста с одной спицефической задачей связанной с DLL  (Прочитано 8893 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Kotiara
Постоялец

ua
Offline Offline

« : 11-08-2009 17:10 » 

Я написал оснувную часть своей программы в Microsoft Visual Studio 2008
на С++ и поместил её в DLL библиотеку затем через сторонюю программу через встроинный в неё скриптовый интерфейс пытаюсь вызвать свою длл прогу но возникает либо внутренняя ошибка загрузки или доступа к функциям либо вылет exe-шника. При этом через тотже интерфейс спокойно загружаются системные длл файлы и из них можно пользоватся функциями. Ради эксперемента попросил друга(он на Delphi7 програмирует)поэсперементировать с длл написаными на делфи
их прога хавает без проблем как я понял в С++ проблема с экспортными опциями  в делфи их помоему около 5 разница в том как грузятся параметры и кто опустошает стек в С++ знаю всего один возможный параметр extern "C"\extern"C++" если кто знает как ещо можно настроить экспортные функции помогите пожалуста Помогите!
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-08-2009 19:09 » 

Koriara, скорее речь идёт о способе вызова функций: C-подобный и Pascal-подобные способы. Обозначаются они специальными словами __cdecl и __stdcall - соответственно. В программа на C/C++ по умолчанию работает __cdecl, а в Delphi и, допустим, в WinAPI - __stdcall. Раз Delphi-библиотеки и системные библиотеки Windows нормально работают со скриптовым интерфейсом, а твои C++-ные - нет, значит нужно каждую твою экспортируемую функцию пометить __stdcall.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 12-08-2009 04:15 » 

Mayor, не те вопросы.

Koriara, пара вопросов.
1. Какие именно ошибки на каких вызовах ты получаешь?
2. Какие параметры ты передаёшь?
3. Есть у меня чувство, что в 2008 студии нужно какой-нибуть ключик выставить. Беглый анализ говорит о том что в 2008-й нужно явно писать __stdcall

windef.h
Код:
#ifdef _MAC
#define CALLBACK    PASCAL
#define WINAPI      CDECL
#define WINAPIV     CDECL
#define APIENTRY    WINAPI
#define APIPRIVATE  CDECL
#ifdef _68K_
#define PASCAL      __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY    WINAPI
#define APIPRIVATE
#define PASCAL      pascal
#endif
Записан

Странно всё это....
Kotiara
Постоялец

ua
Offline Offline

« Ответ #3 : 12-08-2009 18:38 » 

Спасибо за подсказку кое что я и сам выяснил например проблемма с именами при подключении к делфи програме решается за счот подключения .def файла иначе никак а насчот возможности изменить способ экспорта я догадывался но в майкрософтовской системме если не знаеш что искать можно год искать простейшую команду такчто спасибо Dimka и LogRus теперь хоть есть за что зацепится. Я просто впервые всерьйз занялся созданием dll и как оказалось маловато знал про стандарты.
Записан
keg1952
Гость
« Ответ #4 : 01-10-2009 21:24 » 

1.К создаваемому проекту надо добавить созданный ранее при сборке DLL файл с таким же именем, как и DLL но с расширением lib.
2.Создать xxx.h куда поместить все вызовы или часть их, которые будут использоваться в проекте. Примеры
 
typedef struct
{
  unsigned char      cb_par1[2];   // reserved for future use
  unsigned char      codcom[2];   // COMMAND CODE
  unsigned char      cid[4];      // COMMAND ID
  unsigned char   fnr;      // номер файла
  unsigned char   dbid;      // номер БД
  unsigned short     rc;      // код возврата
  unsigned long   isn;      // ISN
  unsigned long      isl;   // с какого номера искать(Low Limit)
  unsigned long      isq;   // количетсво ISN для команды-QUANTITY
  unsigned short   lfb;   // длина форматного буфера-Format
  unsigned short     lrb;   // Record buffer length
  unsigned short     lsb;   // длина буфера поиска-Search
  unsigned short     lvb;   // длина буфера значений-Value
  unsigned short     lib;   // длина буфера-ISN-ов

  unsigned char      cop1;   // COMMAND OPTION 1
  unsigned char      cop2;   // COMMAND OPTION 2

  unsigned char      add1[8];// ADDITION 1
  unsigned char      add2[4];// ADDITION 2
  unsigned char      add3[8];// ADDITION 3
  unsigned char      add4[8];// ADDITION 4
  unsigned char      add5[8];// ADDITION 5

  unsigned long      cb_cmd_time;      // COMMAND TIME

  unsigned char      cb_user_area [4];   // USER AREA

} CB;
static CB con_block;
 
  __declspec(dllimport) void OP1(CB &,int &);
  __declspec(dllimport) void GetUpLN(CB &,int &,int &);
  __declspec(dllimport) void CL1(CB &);

3.В файл xxxDlc.cpp добавить - #include "xxx.h", а далее в программе вызывать эти функции по мере надобности. Примеры

       int   rc;            // код возврата
       char  rabs[9];   // рабочее символьное поле

       .  .  .
         // открыть БД
   OP1(con_block,rc);
           .  .  .
         GetUpLN(con_block,(int &)rabs,rc);
           .  .  .
   // закрыть БД
   CL1((CB &)con_block);
           .  .  .
4. DLL модуль должен находится в той же директории где и EXE программа либо в системных библиотеках, путь к которым был определен при загрузке Windows - это, как правило - SYSTEM и SYSTEM32.

   Успехов!!!
Записан
keg1952
Гость
« Ответ #5 : 01-10-2009 21:47 » new

Да, чуть не забыл в проекте, который создает xxx.DLL, необходимо создать а включитъ в прект
текстовый модуль с расширением DEF, который имеет следующий вид -

; xxx.def : Declares the module parameters for the DLL.

LIBRARY      "xxx"
DESCRIPTION  'xxx Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
   OP1      @01
   CL1      @02
   GetUpLN      @03   

где: xxx - имя создаваемого DLL

Пожалуй все.
Записан
Kotiara
Постоялец

ua
Offline Offline

« Ответ #6 : 02-10-2009 00:23 » 

Проблемму давно решил всем кто помог большое спасибо! Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines