Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заюзать функцию из С-файла в проекте Delphi?


Страницы:   1 2

Бегущий человек ©   (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. поиск по интернету ничего не дал


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо