Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Вниз

Помогите перевести 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.006 c
6-1182958151
апвып
2007-06-27 19:29
2008.03.23
WebBrowser


2-1203860838
dramadol
2008-02-24 16:47
2008.03.23
Обрезать длину файла при перезаписи


2-1203997892
Chorniy
2008-02-26 06:51
2008.03.23
Корректно ли делать так? WaitForSingleObject()


15-1202726594
Циркуль
2008-02-11 13:43
2008.03.23
Сохранение документа в PDF


9-1166219183
Vito
2006-12-16 00:46
2008.03.23
TDXDraw мерцает при изменение размеров окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский