Форум: "Потрепаться";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Вниз
Как написать аналог этого кода на 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.014 c