Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / как експортировать struct из DLL? / 16 сообщений из 16, страница 1 из 1
26.05.2005, 19:45
    #33086243
ТОлег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Доброе время суток!

Такая ситуция: нужно экспортировать структуру (или хотя бы переменную этой структуры) из DLL.
Делаю так:

Код: plaintext
1.
2.
3.
extern "C" __declspec(dllexport) struct MYSTRUCT
{
   int iMember;
}MyStruct;

а в .DEF файле так:

Код: plaintext
1.
EXPORTS
MYSTRUCT  ;DATA // data mozno otkomentit, effekta net...

И вот такие ошибки:

Код: plaintext
1.
2.
error LNK2001: unresolved external symbol MYSTRUCT
fatal error LNK1120:  1  unresolved externals
LINK : fatal error LNK1141: failure during build of exports file

Пробовал в дефинишене писать пеерменную (MyStruct) - не помогло...
Куда копать?

З.Ы. Действие происходит в Вижуал Студио .НЕТ
...
Рейтинг: 0 / 0
26.05.2005, 19:56
    #33086248
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
А если в DLL добавить функцию, которая вернет указатель на эту структуру?
...
Рейтинг: 0 / 0
26.05.2005, 20:11
    #33086263
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
В DLL свое объявление структуры. В твоей программе свое объявление структуры. Ты выделяешь в свой программе память под структуру, и вызываешь функцию из dll передавая ей указатель на свежевыделеную память. Функция из DLL заполняет структуру. Либо наоборот - читает. Но передаешь между программой и dll ты всегда только указатели.
...
Рейтинг: 0 / 0
26.05.2005, 20:32
    #33086271
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
ТОлег
З.Ы. Действие происходит в Вижуал Студио .НЕТ

В MS VC++ 6.0 линкуется, если убрать extern "C"
...
Рейтинг: 0 / 0
26.05.2005, 20:41
    #33086277
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
В MS VC++ 6.0 линкуется конструкция

в DLL

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
extern "C" typedef struct 
{
   int iMember;
}MYSTRUCT;

__declspec(dllexport) MYSTRUCT MyStruct;


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
			MyStruct.iMember= 999 ;
			break;
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}




В программе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
extern "C" typedef struct 
{
   int iMember;
}MYSTRUCT;
__declspec(dllimport) MYSTRUCT MyStruct;

int main(int argc, char* argv[])
{
	printf("%d", MyStruct.iMember);
	return  0 ;
}


...
Рейтинг: 0 / 0
27.05.2005, 10:03
    #33086708
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
авторНо передаешь между программой и dll ты всегда только указатели.

а что ещё можно передавать, кроме указателей? Т.к. какие параметры в "обычной жизни" нельзя передать в dll?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
27.05.2005, 13:22
    #33087411
ТОлег
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Спасиба, Землекоп!

Всё заработало но не понятно, почему не совсем так, как в мануалах к визуал студио...
ИМХО, Борлянду, вот, мой респект. У них всё как-то правильнее всегда...
...
Рейтинг: 0 / 0
27.05.2005, 18:04
    #33088341
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Petro123а что ещё можно передавать, кроме указателей? Т.к. какие параметры в "обычной жизни" нельзя передать в dll?
Ты можешь передавать все что угодно, если это "что угодно" может быть положено на стек. Если значение переменой на стек положить нельзя - эту переменную в dll или из dll можно передавать только через указатели.
Все почти точно так же как и с обычной функцией. Хотя в случае обычной функции компиляторы могут делать неявное конвертирование структур/массивов/объектов в указатели на них, и если в случае собственной функции это можно "не заметить, ну и фиг с ним" в случае внешних функций могут начаться проблемы.
...
Рейтинг: 0 / 0
30.05.2005, 11:17
    #33090179
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
доп. вопрос - встречал передачу из dll как указателя на структуру , так и указателя на указатель на структуру . В чём может быть необходимость этого?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
30.05.2005, 11:23
    #33090209
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Petro123доп. вопрос - встречал передачу из dll как указателя на структуру , так и указателя на указатель на структуру . В чём может быть необходимость этого?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!

Передавая указатель на указатель, можно позволить вызываемой функции записать по этому указателю адресс своей структуры.
...
Рейтинг: 0 / 0
30.05.2005, 11:30
    #33090236
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Lelikk Petro123доп. вопрос - встречал передачу из dll как указателя на структуру , так и указателя на указатель на структуру . В чём может быть необходимость этого?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
Передавая указатель на указатель, можно позволить вызываемой функции записать по этому указателю адресс своей структуры.
например для ускорения перезаписи данных в структурах? Вместо изменения полей в "чужой" структуре мы подставляем свою?????
...
Рейтинг: 0 / 0
31.05.2005, 18:48
    #33093434
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Petro123 LelikkПередавая указатель на указатель, можно позволить вызываемой функции записать по этому указателю адресс своей структуры.
например для ускорения перезаписи данных в структурах? Вместо изменения полей в "чужой" структуре мы подставляем свою?????
Нет, не для ускорения. Просто в этом случае вызываемая функция (локальная или из dll) сама выделяет память, либо использует статичный кусок памяти. Так часто делают если библиотека сама занимается выделением/освобождением памяти под структуры либо работает с единственной копией статичных структур/массивов.
...
Рейтинг: 0 / 0
02.06.2005, 13:43
    #33097232
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
авторТак часто делают если библиотека сама занимается выделением/освобождением памяти под структуры либо работает с единственной копией статичных структур/массивов.
не совсем понятно:
- т.е. указатель на указатель не ускоряет.
- т.е. если это не указатель на указатель то dll не сможет сама распределять и очищать память структур?.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
02.06.2005, 19:32
    #33098329
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Petro123не совсем понятно:
- т.е. указатель на указатель не ускоряет.
А почему он должен ускорять? Тебе в любом случае нужно выделять память под массив раз, заполнять этот массив два. Ты можешь в прикладной программе выделить память, а потом позвать библиотечную функцию чтобы она запомнила. А можешь позвать библиотечную функцию которая выделит тебе память и заполнит ее данными, а потом отдаст тебе указатель на подготовленный массив. Работа то одинаковая в обоих случаях, просто выполняется в разных местах.

Petro123- т.е. если это не указатель на указатель то dll не сможет сама распределять и очищать память структур?.
Почему не может? Может запросто. Только не удобно будет :)
Ну вот пример использования указателя на указатель:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int MakeArray(char **arr) {
   int i;
   *arr = malloc( 1000 );
   if (*arr == NULL) return  0 ;
   for (i= 0 ; i< 1000 ; i++) {
      (*arr)[i] = 'A';
   return  1 ;
}

void main() {
   char *ArrayWithA;
   if (MakeArray( &ArrayWithA ) ==  1 ) {
      printf("ArrayWithA[50]=%c\n", ArrayWithA[ 50 ]);
   } else {
      printf("Failed to create an array\n");
   }
}
...
Рейтинг: 0 / 0
03.06.2005, 11:11
    #33099097
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
Ты экспортировал саму структуру, а не переменную типа этой структуры.

Напиши так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct MYSTRUCT
{
   int iMember;
}

extern "C" {
__declspec(dllexport) MYSTRUCT MyStruct;
}

...
Рейтинг: 0 / 0
03.06.2005, 11:58
    #33099295
Кодер
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как експортировать struct из DLL?
MasterZivТы экспортировал саму структуру, а не переменную типа этой структуры.

Напиши так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct MYSTRUCT
{
   int iMember;
}

extern "C" {
__declspec(dllexport) MYSTRUCT MyStruct;
}



точку с запятой забыл поставить
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / как експортировать struct из DLL? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]