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

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

В MS VC++ 6.0 линкуется, если убрать extern "C"
...
Рейтинг: 0 / 0
как експортировать struct из DLL?
    #33086277
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 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
как експортировать struct из DLL?
    #33086708
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо передаешь между программой и dll ты всегда только указатели.

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

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

Передавая указатель на указатель, можно позволить вызываемой функции записать по этому указателю адресс своей структуры.
...
Рейтинг: 0 / 0
как експортировать struct из DLL?
    #33090236
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelikk Petro123доп. вопрос - встречал передачу из dll как указателя на структуру , так и указателя на указатель на структуру . В чём может быть необходимость этого?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
Передавая указатель на указатель, можно позволить вызываемой функции записать по этому указателю адресс своей структуры.
например для ускорения перезаписи данных в структурах? Вместо изменения полей в "чужой" структуре мы подставляем свою?????
...
Рейтинг: 0 / 0
как експортировать struct из DLL?
    #33093434
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 LelikkПередавая указатель на указатель, можно позволить вызываемой функции записать по этому указателю адресс своей структуры.
например для ускорения перезаписи данных в структурах? Вместо изменения полей в "чужой" структуре мы подставляем свою?????
Нет, не для ускорения. Просто в этом случае вызываемая функция (локальная или из dll) сама выделяет память, либо использует статичный кусок памяти. Так часто делают если библиотека сама занимается выделением/освобождением памяти под структуры либо работает с единственной копией статичных структур/массивов.
...
Рейтинг: 0 / 0
как експортировать struct из DLL?
    #33097232
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТак часто делают если библиотека сама занимается выделением/освобождением памяти под структуры либо работает с единственной копией статичных структур/массивов.
не совсем понятно:
- т.е. указатель на указатель не ускоряет.
- т.е. если это не указатель на указатель то dll не сможет сама распределять и очищать память структур?.
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
как експортировать struct из DLL?
    #33098329
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
как експортировать struct из DLL?
    #33099097
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты экспортировал саму структуру, а не переменную типа этой структуры.

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

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

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

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

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



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


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