Форум: "Прочее";
Текущий архив: 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