![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заюзать функцию из С-файла в проекте Delphi?
Бегущий человек © (2008-03-23 14:53:00)Здравствуйте!
Есть С- файл, в котором есть некая функция. Компилирую в obj. Задача: вызвать функцию из указанного obj внутри проекта Delphi.
Причина такого изврата: в основной задаче встретились такие преобразования типов, которые могли быть реализовано только на С (что и было сделано). Вот такой вопрос
Бегущий человек (2008-03-24 03:25:00) [21]DrPass
Вот и не умничай впредь
Германн
Как это не относится, если выдаваемая ошибка называется "Invalid typecast". Английский язык учим.
Германн (2008-03-24 02:25:00) [22]
> Бегущий человек © (24.03.08 02:09) [8]
>
> >Palva
> >DrPass © (23.03.08 21:59) [7]
>
> За совет спасибо, а кто тут сильно умный и всё умеет в Delphi
> , пусть мне сделает такоe Double(Int64(....
> и я с удовольствием перед ним извинюсь за невежество.
Чушь! К "преобразованию типов" - не относится.
Лучше сразу извиниться за невежество и забыть сей топик.
DrPass (2008-03-24 02:21:00) [23]
> Я нашёл, что Си лучше приводит типы...
Си их вообще не приводит. Он на них забивает :)
Бегущий человек (2008-03-24 02:18:00) [24]Я нашёл, что Си лучше приводит типы...во всяком случае приведение к Double (да к чему угодно - хоть к чёрту лысому) 64разрядного целого проходит безболезненно, в то время как Делфи мучает какие-то функции: объявляй 64 разрядную переменную как Comp, потом вызывай функцию CompToExtended...большой телепатор подсказывает мне, что при этом с точностью происходит хрен знает что. А у меня ошибка кумулятивно накапливается при умножениях... в общем решил, что на Си прокомпилю и подключу уже С-код ( компилированный не паскальным, а именно си-компилятором) и избавлю себя от геморроя.
DrPass (2008-03-24 02:18:00) [25]
> пусть мне сделает такоe Double(Int64
Зависит от того, что надо получить на выходе. Если просто корректно записать int64-переменную в double, то это делается банальным присваиванием, без всяких приведений. Если надо к значению int64 обратиться как к double (боже, зачем?), то достаточно просто объявить его так:
var
i: int64;
d: double absolute i;
Бегущий человек (2008-03-24 02:11:00) [26]>Сpp
спасибо и Вам
Бегущий человек (2008-03-24 02:09:00) [27]>Palva
>DrPass © (23.03.08 21:59) [7]
За совет спасибо, а кто тут сильно умный и всё умеет в Delphi , пусть мне сделает такоe Double(Int64(....
и я с удовольствием перед ним извинюсь за невежество.
DrPass (2008-03-23 21:59:00) [28]
> Надо компилировать в DLL, и вызывать оттуда - Пример для
> компилятора Dev-Cpp:
Ыщо один специалист...
> Задача: вызвать функцию из указанного obj внутри проекта
> Delphi
{$L file.obj}
function bebebe: integer; external;
Подразумевается, что твой obj в OWL-формате.
> Причина такого изврата: в основной задаче встретились такие
> преобразования типов, которые могли быть реализовано только
> на С
Правильнее было бы сказать: "в основной задаче встретились такие преобразования типов, которые я не умею делать в Delphi"
palva (2008-03-23 21:58:00) [29]Пример:
Файл fun.c -------------------------------------------
int __fastcall fun(int n) {
return n + 10;
}
------------------------------------------------------
Компилируется Borland-компилятором:
bcc32 /c fun.c
Получившийся файл fun.obj присоединяется в юните:
Файл objunit.pas -------------------------------------
unit objunit;
interface
function fun(n: Integer): Integer; external;
implementation
{$l fun.obj}
end.
------------------------------------------------------
Юнит используется в главной программе:
------------------------------------------------------
{$APPTYPE CONSOLE}
uses objunit;
begin
WriteLn(fun(24));
end.
------------------------------------------------------
Cpp (2008-03-23 21:39:00) [30]>Компилирую в obj
Надо компилировать в DLL, и вызывать оттуда - Пример для компилятора Dev-Cpp:
//++++++++++++++++++++++++++++++++++++++LIB
#include "lib1.h"
#include <windows.h>
//#include <stdio.h>
DLLIMPORT int liblocalA(int x, int y)
{
return (x + y);
}
DLLIMPORT int mulA(int x, int y)
{
return (x * y);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
//++++++++++++++++++++++++++++++++++++++HEADER
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
//extern "C" {
DLLIMPORT int liblocalA(int x, int y);
DLLIMPORT int mulA(int x, int y);
//}
#endif /* _DLL_H_ */
//++++++++++++++++++++++++++++++++++++++Вызов из Delphi:
implementation {$R *.DFM}
function liblocalA(a,b:Integer):Integer;cdecl; external 'DLL_LIB_2_C.dll';
function mulA(a,b:Integer):Integer;cdecl; external 'DLL_LIB_2_C.dll';
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption:=IntToStr(liblocalA(5,7)+mulA(10,7));
end;
Сергей М. (2008-03-23 20:08:00) [31]
> преобразования типов,
> которые могли быть реализовано только на С
Да ты шо ?! А мужики-то и не знают !
Anatoly Podgoretsky (2008-03-23 16:05:00) [32]> Бегущий человек (23.03.2008 14:53:00) [0]
Из obj файла ничего выполнить нельзя.
Johnmen (2008-03-23 14:58:00) [33]
> в основной задаче встретились такие преобразования типов, которые могли быть реализовано только на С
Давайте лучше это обсудим на D.
Бегущий человек (2008-03-23 14:54:00) [34]P.S. поиск по интернету ничего не дал