![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет!
Такая проблема: Написал на С библиотеку: файл 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;Очень хочется разобраться в данном вопросе, т.к. в будущем потребуется подключать к некоторым проектам С-шные библиотеки. Спасибо. |
|
#2
|
|||
|
|||
|
>говорит, что нет такой функции в библиотеке
Посмотри, какая есть, например с помощью TDUMP.EXE Скорее всего есть _Messagess Во вторых, нужно уточнять соглашения о вызовах. |
|
#3
|
|||
|
|||
|
Удивительно, но выдает, что экспортируемая функция называется как "Function Messagess(int)".
![]() |
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
Я разобрался!
Надо было поставить Extern "C" в Код:
# define DLL_EXP Extern "C" __declspec(dllexport) |
|
#6
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
kast2k (26.10.2012)
| ||
|
#7
|
|||
|
|||
|
Да, я помню о соглашении.
стоит _cdecl |
|
#8
|
||||
|
||||
|
Цитата:
Код:
type Tcalc_double = function ( k: integer ): integer; Должно быть так: Код:
type Tcalc_double = function ( k: integer ): integer; cdecl; |
|
#9
|
|||
|
|||
|
да, на странице не стоит (т.к. на тот момент я еще инфу не нашел), а в текущем коде стоит
![]() и главное, работает ![]() |