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

Вниз

Как написать аналог этого кода на MS Visual C++   Найти похожие ветки 

 
NewWonder ©   (2005-07-02 23:24) [0]

Вопрос не в тему, конечно, но я не знаю куда ещё обратиться. Помогите плиз!

library Dream3D;

uses
 ...;

procedure DrawGreed(l: integer); stdcall;
begin
 ...
end;

procedure DrawVoxel(x, y, z, r: GlFloat);
begin
 ...
end;

exports DrawGreed,
       DrawVoxel;

begin
end.


 
NewWonder ©   (2005-07-02 23:31) [1]

Очень срочно нужно, хелп!


 
isasa ©   (2005-07-02 23:32) [2]

Взять  Visual Studio и создать library,
не забывая
о DEF файле и переопределении имен
DrawGreed => DrawGreed@4


 
isasa ©   (2005-07-02 23:40) [3]

Примерно так.
Необходимыу три файла Dream3D.cpp Dream3D.def, Dream3D.h


// Dream3D.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
     )
{
   return TRUE;
}

void _stdcall DrawGreed(l idx)
{
...........
}

-----------------------------------
// Dream3D.def
//

EXPORTS
DrawGreed=_DrawGreed@20

-----------------------------------
// Dream3D.h
//
extern "C" __declspec(dllexport) void _stdcall DrawGreed(int);


 
NewWonder ©   (2005-07-02 23:55) [4]

Уай, спасибо Вам огромное!!! А зачем нужно DrawGreed=_DrawGreed@20
DrawGreed => DrawGreed@4
?
Я только изучаю C++, после Delphi сложновато приходится и тут меня просят перевести dll"ку, написанную на Delphi в MSVC++, а я только-только основы языка начал изучать. Заранее благодарю!


 
NewWonder ©   (2005-07-02 23:57) [5]

Купил несколько толстеньких книжек по MSVC++, а там ничего с этой тематикой не нашёл :( Надо бы поискать литературу получше.


 
isasa ©   (2005-07-03 00:03) [6]

пардон
точка вжода
procedure DrawGreed(l: integer); stdcall;
в С соответственно
void _stdcall DrawGreed(l idx)

получит в имя _DrawGreed@4

надо

EXPORTS
DrawGreed=_DrawGreed@4


 
isasa ©   (2005-07-03 00:12) [7]

Подробнее
в С компилятор именует точки входа по принципу
_<объявленное имя>@<длина стека параметров>

в данном случае _DrawGreed@4

для вызова снаружи DrawGreed необходимо переопределить имя явно,
иначе во внешном модуле пршлось писать

procedure DrawGreed(l: integer); stdcall; external "mylib.dll" name "_DrawGreed@4";


 
NewWonder ©   (2005-07-03 12:18) [8]

Ешё один, наверное ламерский вопрос, но как узнать длину стека параметров?


 
isasa ©   (2005-07-03 12:41) [9]

:)
берем калькулятор и считаем :), например

void _stdcall myFunction(int, double, double);

4(int)+8(double)+8(double)=20,

значит => _myFunction@20

integer = int = 4 bytes
double = double = 8 bytes
pointer = * = 4 bytes
TmyClass = CClass = 4 bytes

это для Delphi

Type Range Significant digits Size in bytes
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
Comp -2^63+1 .. 2^63 -1 19-20 8
Currency -922337203685477.5808.. 922337203685477.5807 19-20 8

для С см help VS.


 
VMcL ©   (2005-07-03 12:43) [10]

>>NewWonder ©   (03.07.05 12:18) [8]

Просуммировать размеры передаваемых параметров, учитывая, что меньше 4-х байт параметр не использует.


 
NewWonder ©   (2005-07-03 13:30) [11]

Спасибо большое! Как я понял для каждого типа переменной в параметрах процедуры/функции имеется свой размер (фиксированный), а потом всё суммируем. Спасибо ещё раз!


 
isasa ©   (2005-07-03 14:34) [12]

По памяти не вспомню, а VS под рукой нет, но имена точек входа можно посмотреть в файле ссылок,
который генерирует линкер.
По умолчанию, для проекта опция выключена!


 
NewWonder ©   (2005-07-03 14:39) [13]

Ещё раз спасибо! Дальше сам постараюсь разобраться. Вы очень помогли!


 
iskatel ©   (2005-07-04 02:56) [14]

можно не парится, и  с начала не писать def файл, а просто обьявить функции extern, потом посмотреть в полученной длл с помошщью входящей в комплект проги depends как компилятор обозвал эти ф-ции это и будут их имена для def файла )))



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

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

Наверх




Память: 0.5 MB
Время: 0.032 c
1-1120587319
АлексейС
2005-07-05 22:15
2005.07.25
Как оперировать данными интернет сайта ?


1-1120815357
Demidoff
2005-07-08 13:35
2005.07.25
Как прописать обработку архива чере ShellExecuteEx,CreateProcess?


14-1119841484
Skier
2005-06-27 07:04
2005.07.25
В Крым на машине...


14-1120041635
infom
2005-06-29 14:40
2005.07.25
Помогите решить задачу !


1-1118160195
Дмитрий_05
2005-06-07 20:03
2005.07.25
Изменение размера формы мышкой