Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

Помогите перевести dll на Си, пожалуйста?   Найти похожие ветки 

 
Буран   (2008-01-23 06:16) [0]

Library Demo1;

uses
 SysUtils, Classes, ActiveX, AxCtrls, Dialogs;

{$R *.RES}

type
 TTestInfo = packed record
    Name    : array [0..7] of Char;
    Int1    : Integer;
    Single1 : Single;
 end;

function Test1: TTestInfo; stdcall;
begin
 Result.Name               := "Test1";
 Result.Int1               := 1;
 Result.Sinlge1            := 1.1;
 ShowMessage("Hello world 1");
end;

procedure Test2(a_Stream : IStream); stdcall;
var
 OS        : TOleStream;
 MS        : TStream;
 TestInfo1 : TTestInfo;
begin
 OS := TOLEStream.Create(a_Stream);
 MS := TMemoryStream.Create;
 try
   OS.Position := 0;
   MS.CopyFrom(OS, OS.Size);
   MS.Position := 0;

   MS.Read(TestInfo1, SizeOf(TTestInfo));

   ...
   ShowMessage("Hello world 2");
   ...

   MS.Position := 0;
   MS.Write(TestInfo1, SizeOf(TTestInfo));

   MS.Position := 0;
   OS.Position := 0;
   OS.CopyFrom(MS, MS.Size);
   OS.Position := 0;

 finally
   MS.Free;
   OS.Free;
 end;
end;

exports
 Test1, Test2;

begin
end.


Может есть какие автоматические переводчики? Просто я больше по Дельфи шарю, а в Си не очень.

Test1 - возрващает структуру.
Test2 - получает данные из массив a_Stream, после этого засылает данные обратно в него.

Как такое можно перевести?


 
Буран   (2008-01-23 06:56) [1]

Оговорка. Не из массива a_Stream, а конечно же из потока a_Stream.


 
clickmaker ©   (2008-01-23 11:15) [2]

на си-билдер, что-ли?


 
Буран   (2008-01-25 04:31) [3]

test


 
Буран   (2008-01-25 04:35) [4]

Вчера мне писали, что я не имею права писать на этот форум. В чём причина?


 
Буран   (2008-01-25 04:38) [5]


> clickmaker ©   (23.01.08 11:15) [2]
> на си-билдер, что-ли?


Идея в том, чтобы люди пишущие на Си имели пример dll, которую можно было бы использовать с моей программой на Дельфи. Думаю вопрос многим интересен.


 
Черный Шаман   (2008-01-25 05:12) [6]


>  OS        : TOleStream;
>  MS        : TStream;


Явного соответствия этим классам в C++ нет. Так что копай в MFC. Если бы оно было еще на Winapi, то можно было бы.


 
Буран   (2008-01-25 05:24) [7]


> Черный Шаман   (25.01.08 05:12) [6]
>
>
> >  OS        : TOleStream;
> >  MS        : TStream;
>
>
> Явного соответствия этим классам в C++ нет. Так что копай
> в MFC.


MS : TStream; - не обязательно. Просто для удобства сделано.

А если без TOleStream, то как вообще в Си передают массивы данных произвольной длины в функции?


 
ketmar ©   (2008-01-25 09:41) [8]

>[7] Буран (25.01.08 05:24)
>А если без TOleStream, то как вообще в Си передают массивы данных
>произвольной длины в функции?

утреннее хорошее настроение, йопт… дети микрософта…


 
Семеныч   (2008-01-25 10:21) [9]

> как вообще в Си передают массивы данных произвольной длины в
> функции?

Так же, как и не в Си - передают адрес и длину.


 
Черный Шаман   (2008-01-25 16:34) [10]

Вот тебе пример первой функции, по аналогии сделаешь и вторую

С код

#include <windows.h>
#include <string.h>

struct TTestInfo
{
char name[8];
int int1;
float single1;
};

/*---------------------------------------------------------------------------------
Экспорт функций
---------------------------------------------------------------------------------*/
extern "C" __declspec(dllexport) TTestInfo Test1();

TTestInfo Test1()
{
static TTestInfo res;

res.int1 = 1;
res.single1 = 1.1;
strcpy(res.name, "Test1");
MessageBox(0, "Hello world 1","Hello world 1",0);

return res;
}


Delphi код

 TTestInfo = packed record
   Name    : array [0..7] of Char;
   Int1    : Integer;
   Single1 : Single;
 end;

function Test1: TTestInfo; cdecl; external "testdll.dll" name "Test1";

implementation

procedure TForm1.Button1Click(Sender: TObject);
var
 lti: TTestInfo;
begin
 lti := Test1;
 ShowMessage(lti.Name);
end;


 
Буран   (2008-01-26 06:59) [11]


> Черный Шаман   (25.01.08 16:34) [10]
>
> Вот тебе пример первой функции, по аналогии сделаешь и вторую

А какая здесь аналогия с OS : TOleStream; ?


> Семеныч   (25.01.08 10:21) [9]
>
> > как вообще в Си передают массивы данных произвольной длины
> в
> > функции?
>
> Так же, как и не в Си - передают адрес и длину.


А возвращать как тогда? Вписать новую длину и зафигачить по адресу некие данные не обращая внимания на то, сколько там под них отведено места? Или надо заранее резеривировать гигибайт, чтобы точно на всё хватило?

В Дельфи это делается через поток.


 
Буран   (2008-01-26 06:59) [12]


> Черный Шаман   (25.01.08 16:34) [10]
>
> Вот тебе пример первой функции, по аналогии сделаешь и вторую

Спасибо.
А какая здесь аналогия с OS : TOleStream; ?


> Семеныч   (25.01.08 10:21) [9]
>
> > как вообще в Си передают массивы данных произвольной длины
> в
> > функции?
>
> Так же, как и не в Си - передают адрес и длину.


А возвращать как тогда? Вписать новую длину и зафигачить по адресу некие данные не обращая внимания на то, сколько там под них отведено места? Или надо заранее резеривировать гигибайт, чтобы точно на всё хватило?

В Дельфи это делается через поток.


 
Kerk ©   (2008-01-26 18:39) [13]

Если мне не изменяет склероз, в винапи такое просто реализовано. Первый раз функция вызывается с null в параметре-указателе на буфер и функция, зная остальные параметры, просто возращает необходимый размер буфера. Далее ты выделяешь это буфер и уже вызываешь функцию еще раз с указателем на него.


 
Черный Шаман   (2008-01-26 20:13) [14]


> Kerk ©   (26.01.08 18:39) [13]
>
> Если мне не изменяет склероз, в винапи такое просто реализовано.
>  Первый раз функция вызывается с null в параметре-указателе
> на буфер и функция, зная остальные параметры, просто возращает
> необходимый размер буфера. Далее ты выделяешь это буфер
> и уже вызываешь функцию еще раз с указателем на него.


Можно сделать и проще если работать с dll только с одного потока, тогда память можно выделять статически в глобальных выражениях. Мне это было проще сделать, чем объяснить человеку зачем выделять память для передачи массива.


 
Буран   (2008-01-28 06:20) [15]

Как сделать через поток? Это же поток Виндос, а не Дельфи. Значит на Си или Си++ с ним тоже должны быть способы работать.


 
SPeller (work)   (2008-01-28 07:09) [16]

Потоков виндос не бывает.


 
Буран   (2008-02-05 04:53) [17]


> SPeller (work)   (28.01.08 07:09) [16]
>
> Потоков виндос не бывает.


А TOleStream - это что?


 
Джо ©   (2008-02-05 06:09) [18]

> [17] Буран   (05.02.08 04:53)
>
> > SPeller (work)   (28.01.08 07:09) [16]
> >
> > Потоков виндос не бывает.
>
>
> А TOleStream - это что?

А TOleStream это не поток виндовс.


 
Буран   (2008-02-05 06:19) [19]

Как перевести на Си или Си++?


 
Черный Шаман   (2008-02-05 16:35) [20]


> Буран   (05.02.08 06:19) [19]
>
> Как перевести на Си или Си++?


50$


 
Буран   (2008-02-06 04:51) [21]


> Черный Шаман   (05.02.08 16:35) [20]
>
> > Буран   (05.02.08 06:19) [19]
> >
> > Как перевести на Си или Си++?
>
> 50$
>


За этим обычно прячут своё незнание. Типа вот если бы мне дали миллиард долларов, то я бы такое написал. Только вот никто не даёт. Поэтому и пишу только крестики-нолики.

К стати ошибка выдаётся в строке:
extern "C" __declspec(dllexport) TTestInfo Test1();


 
Черный Шаман   (2008-02-06 16:25) [22]


> Буран   (06.02.08 04:51) [21]


Купи книжку.


> К стати ошибка выдаётся в строке:
> extern "C" __declspec(dllexport) TTestInfo Test1();


Ты каким компилятором Компилируешь? Я MS VC++ 2005 Может есть какие-то проблемы несовместимости?

Параметры сборки
В Свойствах проекта (General) отключить Unicode
В Параметрах C++ в Code Generation включить Runtime Library /MD

Вот, если хочешь stdcall соглашение использовать

#include <windows.h>
#include <string.h>

struct TTestInfo
{
char name[8];
int int1;
float single1;
};

/*---------------------------------------------------------------------------------
Экспорт функций
---------------------------------------------------------------------------------*/
extern "C" __declspec(dllexport) TTestInfo __stdcall Test1();

TTestInfo __stdcall Test1()
{
static TTestInfo res;

res.int1 = 1;
res.single1 = 1.1;
strcpy(res.name, "Test1");
MessageBox(0, "Hello world 1","Hello world 1",0);

return res;
}


 
Буран   (2008-02-08 02:42) [23]


> Черный Шаман   (06.02.08 16:25) [22]
> Ты каким компилятором Компилируешь? Я MS VC++ 2005 Может
> есть какие-то проблемы несовместимости?


Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Бесплатный.

Может какие параметры в командной строке нужны?


 
Буран   (2008-02-11 02:04) [24]

Я сообразил. У меня же dll. А какие опции компилятору надо дать, чтобы он понял, что надо скомпилировать именно dll, а не exe?

Выдаёт вот такую вот справку.

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Syntax is: BCC32 [ options ] file[s]     * = default; -x- = turn switch x off
 -3    * 80386 Instructions        -4      80486 Instructions
 -5      Pentium Instructions      -6      Pentium Pro Instructions
 -Ax     Disable extensions        -B      Compile via assembly
 -C      Allow nested comments     -Dxxx   Define macro
 -Exxx   Alternate Assembler name  -Hxxx   Use pre-compiled headers
 -Ixxx   Include files directory   -K      Default char is unsigned
 -Lxxx   Libraries directory       -M      Generate link map
 -N      Check stack overflow      -Ox     Optimizations
 -P      Force C++ compile         -R      Produce browser info
 -RT   * Generate RTTI             -S      Produce assembly output
 -Txxx   Set assembler option      -Uxxx   Undefine macro
 -Vx     Virtual table control     -X      Suppress autodep. output
 -aN     Align on N bytes          -b    * Treat enums as integers
 -c      Compile only              -d      Merge duplicate strings
 -exxx   Executable file name      -fxx    Floating point options
 -gN     Stop after N warnings     -iN     Max. identifier length
 -jN     Stop after N errors       -k    * Standard stack frame
 -lx     Set linker option         -nxxx   Output file directory
 -oxxx   Object file name          -p      Pascal calls
 -tWxxx  Create Windows app        -u    * Underscores on externs
 -v      Source level debugging    -wxxx   Warning control
 -xxxx   Exception handling        -y      Produce line number info
 -zxxx   Set segment names


 
ketmar ©   (2008-02-11 02:08) [25]

>[24] Буран ()
>какие опции компилятору надо дать

никаких. потому что созданием DLL занимается не компилятор, а линкер.

---
Understanding is not required. Only obedience.


 
Буран   (2008-02-11 02:29) [26]


> ketmar ©   (11.02.08 02:08) [25]
>
> >[24] Буран ()
> >какие опции компилятору надо дать
> никаких. потому что созданием DLL занимается не компилятор,
>  а линкер.


ilink32.exe ? А ему тогда какие опции указать?


 
ketmar ©   (2008-02-11 02:30) [27]

>[26] Буран (2008-02-11 02:29:00)
>А ему тогда какие опции указать?

у тебя украли справку и под страхом расстрела запретили гугль?

---
Understanding is not required. Only obedience.


 
Буран   (2008-02-11 02:34) [28]


> ketmar ©   (11.02.08 02:30) [27]
> у тебя украли справку и под страхом расстрела запретили
> гугль?


Тебе трудно отвтетить?

В разделе справки dll нихрена об этом нет, так, что ты советуешь другим херню.


 
ketmar ©   (2008-02-11 02:38) [29]

>[28] Буран (2008-02-11 02:34:00)
значит, страдай дальше. скажу по секрету: DLL при помощи bcc я собирал только в полночь, предварительно принеся в жертву Сотоне девственницу. а тебе просто не хотел открывать сей секретный метод.

зыж опять малолетний попрыгунчик считает, что все ему должны. почему они не вымирают? %-((

---
Understanding is not required. Only obedience.


 
Буран   (2008-02-11 03:04) [30]


> ketmar ©   (11.02.08 02:38) [29]
> зыж опять малолетний попрыгунчик считает, что все ему должны.
>  почему они не вымирают? %-((


Ну так вымри в этой ветке. Что ты вообще разфлудился здесь? Сам помочь не можешь, так другим не мешай, тем кто не сноб.


 
ketmar ©   (2008-02-11 03:19) [31]

>[30] Буран (2008-02-11 03:04:00)
дурачок ты анонимный. скажи ещё что-то, повесели меня перед сном.

---
Understanding is not required. Only obedience.



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.016 c
11-1186397670
Александр 2006
2007-08-06 14:54
2008.03.23
Снова про Proxies.dcu


15-1202580316
В,алекс
2008-02-09 21:05
2008.03.23
Виста / D7


15-1202801091
needhelp
2008-02-12 10:24
2008.03.23
борьба с adWare/SpyWare


2-1203529658
voe
2008-02-20 20:47
2008.03.23
работа с координатами.


15-1202579701
88Lion88
2008-02-09 20:55
2008.03.23
Литература