Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание dll в LCC, Как создать dll используя компилятор lcc 
:(
    Опции темы
Гость_Andy
Дата 9.11.2004, 10:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Плиз, хелп!

Неполучается создать dll модуль в lcc, точнее dll создаётся, но функций из неё я вызвать не могу!

В чём может быть дело?


Заранее благодарен за помощь.


  Вверх
shedon
Дата 9.11.2004, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Я с таким компилятором не работал, но опиши подробнее как функции экспортируешь/импортируешь , как загружаешь длл, как вызываешь функцию ?


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
D_BuG
Дата 9.11.2004, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.11.2004

Репутация: нет
Всего: нет



Это Andy, я зарегился под D_BUG.

Итак:

Есть файл dll.c

#include <windows.h>
#include <stdio.h>

extern "C" __declspec(dllexport) int MyFunction();



extern "C" __declspec(dllexport) int MyFunction()

{
return 1;

}


После этого компилятор выдаёт кучу ошибок:

Wedit output window build: Tue Nov 9 10:41:02 2004
Warning d:\lcc\projects\dll\dll.c: 7 no type specified. Defaulting to int
Error d:\lcc\projects\dll\dll.c: 7 empty declaration
Error d:\lcc\projects\dll\dll.c: 7 Syntax error; missing semicolon before "C"
Error d:\lcc\projects\dll\dll.c: 7 unrecognized declaration
Warning d:\lcc\projects\dll\dll.c: 11 no type specified. Defaulting to int
Error d:\lcc\projects\dll\dll.c: 11 empty declaration
Error d:\lcc\projects\dll\dll.c: 11 Syntax error; missing semicolon before "C"
Error d:\lcc\projects\dll\dll.c: 11 unrecognized declaration
Compilation + link time:0.1 sec, Return code: 1

А соответственно если extern не делать , то моих функций невидно из вне :-(

Пример:

#include <windows.h>
#include <stdio.h>

int __declspec(dllexport) MyFunction();


MyFunction();

{
return 1;

}

или


#include <windows.h>
#include <stdio.h>



int __declspec(dllexport) MyFunction()

{
return 1;

}

Вызов с помощью обычных LoadLibrary() и GetProcAddress().

Пример:

#include <windows.h>
typedef int (WINAPI *PFN_MyFunction)(char *);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HINSTANCE hMyDll;
if((hMyDll=LoadLibrary("dll.dll"))==NULL) return 1;

PFN_MyFunction pfnMyFunction;
pfnMyFunction=(PFN_MyFunction)GetProcAddress(hMyDll,"MyFunction");
int iCode=(*pfnMyFunction)();

FreeLibrary(hMyDll);
return 0;
}

Это сообщение отредактировал(а) D_BuG - 9.11.2004, 11:00
PM MAIL   Вверх
shedon
Дата 9.11.2004, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Если вызываешь функцию из динамически подключённой длл'ки, то тебе ещё надо добавить функцию в таблицу экспорта в *.def файл.
Например так:
Код

LIBRARY NameMyLibrary
MyFunction @1

Что возвращают LoadLibrary() и GetProcAddress() ?


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
D_BuG
Дата 9.11.2004, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.11.2004

Репутация: нет
Всего: нет



Цитата(shedon @ 9.11.2004, 11:05)
Если вызываешь функцию из динамически подключённой длл'ки, то тебе ещё надо добавить функцию в таблицу экспорта в *.def файл.
Например так:
Код

LIBRARY NameMyLibrary
MyFunction @1

Что возвращают LoadLibrary() и GetProcAddress() ?

Про .def неподумал что он обязателен.


LoadLibrary() - адрес длл
GetProcAddress() - NULL :-(


То есть длл подгружается, а функцию вызвать никак :-(
PM MAIL   Вверх
shedon
Дата 9.11.2004, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Цитата(D_BuG @ 9.11.2004, 08:12)
GetProcAddress() - NULL :-(

Вызови GetLastError и посмотри код ошибки...


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
D_BuG
Дата 9.11.2004, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.11.2004

Репутация: нет
Всего: нет



Цитата(shedon @ 9.11.2004, 11:22)
Цитата(D_BuG @ 9.11.2004, 08:12)
GetProcAddress() - NULL :-(

Вызови GetLastError и посмотри код ошибки...

Вот что получилось:

d:\lcc\projects\dll\loaddll\lcc\loaddll.exe

Starting...OK!
LoadLibrary...OK!
Error:0
GetProcAddress...Failed!
Error:127

Вот сам исходник:

#include <windows.h>
typedef int (*PFN_MyFunction)(char *);

int main(int argc,char *argv[])
{
printf("Starting...OK!\n");

HINSTANCE hMyDll;
if((hMyDll=LoadLibrary("dll.dll"))==NULL)
{
printf("LoadLibrary...Failed!\nError:%d\n",GetLastError());
return -1;
}
else
{
printf("LoadLibrary...OK!\n");
}

PFN_MyFunction pfnMyFunction;
pfnMyFunction=(PFN_MyFunction)GetProcAddress(hMyDll,"MyFunction");

if(pfnMyFunction==NULL)
{
printf("GetProcAddress...Failed!\nError:%d\n",GetLastError());
return -1;
}
else
{
printf("GetProcAddress...OK!\n");
}

int iCode=(*pfnMyFunction)("");

FreeLibrary(hMyDll);
return 0;
}

PM MAIL   Вверх
shedon
Дата 9.11.2004, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



127 - Не найдена указанная процедура
Ты добавил функцию в деф файл ?
и убери в исходниках библиотеки __declspec(dllexport)


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
D_BuG
Дата 9.11.2004, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.11.2004

Репутация: нет
Всего: нет



Цитата(shedon @ 9.11.2004, 14:14)
127 - Не найдена указанная процедура
Ты добавил функцию в деф файл ?
и убери в исхолниках библиотеки __declspec(dllexport)

Да уже довно добавил..... и всё равно ненайдена :-(


Вот щас на Visual .NET c++ съделал:

extern "C" __declspec(dllexport) void MyFunction();

extern "C" __declspec(dllexport) void MyFunction()
{
printf("I'm MyFunction()!!!\n");
}


И всё работает на УРА!

d:\lcc\projects\dll\loaddll\lcc\loaddll.exe

Starting...OK!
LoadLibrary...OK!
GetProcAddress...OK!
I'm MyFunction()!!!

А в LCC нехочет....

Где же может ещё быть собака зарыта????

PM MAIL   Вверх
Tatarin
Дата 10.11.2004, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 5.1.2004
Где: Россия

Репутация: нет
Всего: нет



про __declspec в MSDN сказано:
Microsoft Specific
т.е. это фича чисто микрософтовская и их компилятора... Для других компиляторов надо либо использовать DEF-файл, либо читать хелп к нему - может у него тоже подобные трюки есть
PM MAIL   Вверх
D_BuG
Дата 10.11.2004, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.11.2004

Репутация: нет
Всего: нет



Спасибо большое всем!(особенно shedon за оперативность :-))


Решение нашол :-)


Вопрос снят.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0746 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.