Я пробую написать набор функций для импортирования в game maker. Функции писал ради эксперемента. Но тут возникли 2 проблемы: 1.я недостаточно знаю с++(пока что) 2.следствие из первого Пользуюсь комписятором Dev C++. При создании проекта dll он создает два файла: А.cpp и A.h. В первом написан такой код(писал не я, а сам заварганился):
Code
/* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h> using namespace std;
DllClass::DllClass() {
}
DllClass::~DllClass () {
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break;
case DLL_PROCESS_DETACH: break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break; }
/* Returns TRUE on success, FALSE on failure */ return TRUE; }
Честно говоря плохо понимаю в чем здесь суть, но код прочитать могу Для чистоты выложу еще файл h:
class DLLIMPORT DllClass { public: DllClass(); virtual ~DllClass(void);
private:
};
#endif /* _DLL_H_ */
Вообщем 1.вопрос заключается в том куда вставить свою функцию Про конструкторы и деструкторы я еще не проходил поэтому не представляю как с ними работать Но сам я пробывал заварганить функцию в конце файла cpp в h конечно же я не стал пихать 2.В справке написан пример на дельфи Там написано так:
Code
library MyDLL;
uses SysUtils, Classes;
function MyMin(x,y:double):double; cdecl; begin if x<y then Result := x else Result := y; end;
var res : array[0..1024] of char;
function DoubleString(str:PChar):PChar; cdecl; begin StrCopy(res,str); StrCat(res,str); Result := res; end;
exports MyMin, DoubleString;
begin end.
Меня интересует строчка cdecl. Вроде там упоминается что надо исп. либо cdecl либо stdcall. Но что это такое я не понимаю. Пробывал так сделать, но выдает ошибку. Решил сделать так, пример:
Code
_cdecl double SUM(double a,double b) { return a+b; }
Это я в сети нашел: _cdecl и _stdcall но опять же что это?
Сообщение отредактировал Maxaon - Понедельник, 10 Сентября 2012, 13:11
Это конвенции вызова, можешь википедию почитать. Что касается самой dll, экспортировать в твоем случае надо С-функции(а не С++ и тем более не классы). К примеру вот так: lib.h
ADD ГМ требует соблюдения __cdecl конвенции, в VC++ по-моему она стоит по-умолчанию, но на всякий случай лучше писать double __cdecl SUM Многие вопросы по Windows отпадут, если посмотреть тут
Сообщение отредактировал Нохчи - Понедельник, 10 Сентября 2012, 13:33
Сейчас попробывал код lib.h и lib.c Ошибку выдает: 1 ... myproj\A.c In file included from lib.c 4 ... myproj\lib.h expected constructor, destructor, or type conversion before '(' token 4 ... myproj\lib.h expected `,' or `;' before '(' token 3 ... myproj\lib.c expected constructor, destructor, or type conversion before '(' token ...myproj\lib.c expected `,' or `;' before '(' token ...myproj\Makefile.win [Build Error] [lib.o] Error 1
ой да я все в одном проекте делаю убирать все лишнее лень сейчас создал новый Но все-таки опять ошибка: 1 C:\Program Files\Dev C++\Dev-Cpp\myproj\lib.c In file included from lib.c 4 C:\Program Files\Dev C++\Dev-Cpp\myproj\lib.h syntax error before string constant C:\Program Files\Dev C++\Dev-Cpp\myproj\Makefile.win [Build Error] [lib.o] Error 1
Добавлено (10.09.2012, 13:48) --------------------------------------------- Еще почему то после сборки при запуске gm какой то файл dat требует посмотрел другие библиотеки к gm, там везде dat может это dev c++ не дает?
Сообщение отредактировал Maxaon - Понедельник, 10 Сентября 2012, 13:49
Скопипастил код из #2 в VC++, DLL собирается без проблем. Попробуй _declspec поменять на __declspec(с двумя подчеркиваниями). Если не поможет, присылй проект. Многие вопросы по Windows отпадут, если посмотреть тут