Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.10.2012, 14:03
kast2k kast2k вне форума
Прохожий
 
Регистрация: 07.06.2011
Сообщения: 11
Репутация: 10
Вопрос Подключить С-библиотеку. Не находит функцию

Всем привет!
Такая проблема:
Написал на С библиотеку:
файл unit1.cpp
Код:
#define BUILD_DLL
#include "File1.h"
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
int Messagess (int k)
{
        return k;
}

заголовочный файл File1.h
Код:
#if defined(BUILD_DLL)
# define DLL_EXP __declspec(dllexport)
#else
# if defined(BUILD_APP)
# define DLL_EXP __declspec(dllimport)
# else
# define DLL_EXP
# endif
#endif
DLL_EXP int Messagess (int k);

нарисовал в Дельфи тестовую форму с кнопкой
Код:
type
Tcalc_double = function ( k: integer ): integer;
................

procedure TForm1.Button2Click(Sender: TObject);
var 
  hndDLLHandle: THandle;
  calc_double: Tcalc_double;
begin
    try 
       hndDLLHandle := loadLibrary ( 'C:\C\t3\project1.dll' );
       if hndDLLHandle <> 0 then begin
          @calc_double := getProcAddress ( hndDLLHandle, 'Messagess' );
          if addr ( calc_double ) <> nil then begin
             showMessage ( intToStr ( calc_double ( 105 ) ) );
          end else
             showMessage ( 'Function not exists...' );
       end else
          showMessage ( 'DLL not found...' );
    finally
       freeLibrary ( hndDLLHandle );
    end;
end;
Смотрю в дебаге - библиотеку подцепил, а вот функция getProcAddress ( hndDLLHandle, 'Messagess' ) говорит, что нет такой функции в библиотеке.

Очень хочется разобраться в данном вопросе, т.к. в будущем потребуется подключать к некоторым проектам С-шные библиотеки.

Спасибо.
Ответить с цитированием
  #2  
Старый 26.10.2012, 15:00
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

>говорит, что нет такой функции в библиотеке
Посмотри, какая есть, например с помощью TDUMP.EXE
Скорее всего есть _Messagess
Во вторых, нужно уточнять соглашения о вызовах.
Ответить с цитированием
  #3  
Старый 26.10.2012, 15:19
kast2k kast2k вне форума
Прохожий
 
Регистрация: 07.06.2011
Сообщения: 11
Репутация: 10
По умолчанию

Удивительно, но выдает, что экспортируемая функция называется как "Function Messagess(int)".
Ответить с цитированием
  #4  
Старый 26.10.2012, 15:28
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kast2k
Удивительно, но выдает, что экспортируемая функция называется как "Function Messagess(int)".
Есть подозрение, что имя этой экспортруемой функции декорированное (замангленное). Выложи куда-нибудь эту тестовую dll-ку.
Ответить с цитированием
  #5  
Старый 26.10.2012, 15:58
kast2k kast2k вне форума
Прохожий
 
Регистрация: 07.06.2011
Сообщения: 11
Репутация: 10
По умолчанию

Я разобрался!
Надо было поставить Extern "C" в
Код:
# define DLL_EXP Extern "C" __declspec(dllexport)
в этом случае декорирование пропадает.
Ответить с цитированием
  #6  
Старый 26.10.2012, 16:03
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kast2k
Я разобрался!
Надо было поставить Extern "C" в
Код:
# define DLL_EXP Extern "C" __declspec(dllexport)
в этом случае декорирование пропадает.
Ещё не забудь о соглашениях о вызове. В Delphi по-умолчанию соглашение "register", а в Си "cdecl" (в Си++ возможно не "cdecl", а "stdcall ", но тут я не уверен). Если укажешь не то соглашение о вызове могут возникнуть проблемы.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
kast2k (26.10.2012)
  #7  
Старый 26.10.2012, 16:22
kast2k kast2k вне форума
Прохожий
 
Регистрация: 07.06.2011
Сообщения: 11
Репутация: 10
По умолчанию

Да, я помню о соглашении.
стоит _cdecl
Ответить с цитированием
  #8  
Старый 26.10.2012, 16:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kast2k
Да, я помню о соглашении.
стоит _cdecl
А здесь-то не стоит:
Код:
type
Tcalc_double = function ( k: integer ): integer;

Должно быть так:
Код:
type
Tcalc_double = function ( k: integer ): integer; cdecl;
Ответить с цитированием
  #9  
Старый 26.10.2012, 16:39
kast2k kast2k вне форума
Прохожий
 
Регистрация: 07.06.2011
Сообщения: 11
Репутация: 10
По умолчанию

да, на странице не стоит (т.к. на тот момент я еще инфу не нашел), а в текущем коде стоит
и главное, работает
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter