Как пробиться в адресное пространство?
От: Stich Россия  
Дата: 23.03.05 01:03
Оценка:
Я написал библиотеку с экспортируемой функцией. Если вызывать функцию из tmain, тогда она работает отлично, а если я пытаюсь вызвать ее в фукции, работающей в своем адресном пространстве, то линкер дает ошибку —
work.obj : error LNK2019: unresolved external symbol "void __cdecl Work::EventWr(void)" (?EventWr@Work@@YAXXZ) referenced in function "void __cdecl Work::Run(void)" (?Run@Work@@YAXXZ)
.\Debug/serv.exe : fatal error LNK1120: 1 unresolved externals
Как сделать, чтобы она работала именно в этой функции?
Ад был переполнен, пришлось вернуться
Re: Как пробиться в адресное пространство?
От: Leshi Россия  
Дата: 23.03.05 09:07
Оценка:
Здравствуйте, Stich, Вы писали:

S>Я написал библиотеку с экспортируемой функцией. Если вызывать функцию из tmain, тогда она работает отлично, а если я пытаюсь вызвать ее в фукции, работающей в своем адресном пространстве, то линкер дает ошибку -

Так, начнем с того, что адресное пространство появляется значительно позже, чем линкер выдает ошибку. Адресное пространство появляется у программы после ее загрузки операционной системой и исчезает после выгрузки
S>work.obj : error LNK2019: unresolved external symbol "void __cdecl Work::EventWr(void)" (?EventWr@Work@@YAXXZ) referenced in function "void __cdecl Work::Run(void)" (?Run@Work@@YAXXZ)
S>.\Debug/serv.exe : fatal error LNK1120: 1 unresolved externals
S>Как сделать, чтобы она работала именно в этой функции?
Оччень непонятно кто где. Начнем по порядку.
библиотеку с экспортируемой функцией это DLL?
Функция, которую ты вызываешь, описана в библиотеке?
... << RSDN@Home 1.1.3 stable >>
Re[2]: Как пробиться в адресное пространство?
От: Stich Россия  
Дата: 23.03.05 23:40
Оценка:
Здравствуйте, Leshi, Вы писали:

L>Так, начнем с того, что адресное пространство появляется значительно позже, чем линкер выдает ошибку. Адресное пространство появляется у программы после ее загрузки операционной системой и исчезает после выгрузки


не знал... вернее знал, но вопрос сформулировал неправильно, наверно я имел ввиду пространство имен

L>Оччень непонятно кто где. Начнем по порядку.

L>библиотеку с экспортируемой функцией это DLL?
L>Функция, которую ты вызываешь, описана в библиотеке?

да, в длл описана экспортирумая функция

log.cpp
#include <vcl.h>
#include <windows.h>
#include "log1.h"
#pragma hdrstop
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
void EventWr()
{
DWORD kol;
HANDLE FileHandleEx = CreateFileA("gon.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
WriteFile(FileHandleEx,"123",3,&kol,NULL);
CloseHandle(FileHandleEx);
}

log1.h
extern "C" void __declspec(dllexport) EventWr(); это сам экспорт

а это .def файл, где EventWr — алиас _EventWr(т.к. длл сделана в билдере)
LIBRARY LOG.DLL

EXPORTS
EventWr @3 ; EventWr
_EventWr @2 ; _EventWr
___CPPdebugHook @1 ; ___CPPdebugHook
Ад был переполнен, пришлось вернуться
Re[3]: Как пробиться в адресное пространство?
От: Leshi Россия  
Дата: 24.03.05 08:26
Оценка:
Здравствуйте, Stich, Вы писали:

L>>Функция, которую ты вызываешь, описана в библиотеке?

S>да, в длл описана экспортирумая функция
Так, это хорошо. Как ты подключаешь DLL: явно (LoadLibrary) или неявно (в хедерах программы надо писАть extern "C" void __declspec(dllimport) EventWr(); и при линковке подключать файл mydll.lib, в твоем случае, скорее log.lib)?
... << RSDN@Home 1.1.3 stable >>
Re[4]: Как пробиться в адресное пространство?
От: Stich Россия  
Дата: 24.03.05 23:30
Оценка:
Здравствуйте, Leshi, Вы писали:

L>Здравствуйте, Stich, Вы писали:


L>>>Функция, которую ты вызываешь, описана в библиотеке?

S>>да, в длл описана экспортирумая функция
L>Так, это хорошо. Как ты подключаешь DLL: явно (LoadLibrary) или неявно (в хедерах программы надо писАть extern "C" void __declspec(dllimport) EventWr(); и при линковке подключать файл mydll.lib, в твоем случае, скорее log.lib)?

я подключал неявно и lib файл присоединял.Однако extern "C" void __declspec(dllimport) EventWr(); не писал.Это надо писать в хидере главного модуля или модуля где я хочу функцию использовать?
Ад был переполнен, пришлось вернуться
Re[5]: Как пробиться в адресное пространство?
От: Leshi Россия  
Дата: 25.03.05 12:05
Оценка:
Здравствуйте, Stich, Вы писали:

S>я подключал неявно и lib файл присоединял.Однако extern "C" void __declspec(dllimport) EventWr(); не писал.Это надо писать в хидере главного модуля или модуля где я хочу функцию использовать?

Надо это писать так, чтобы когда ты вызываешь EventWr это определение уже было. Хочешь в главный хедер, хочешь непосредственно перед вызовом.
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.