Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Написание DLL

278
11 августа 2008 года
Alexander92
1.1K / / 04.08.2008
Столкнулся со следующей проблемой. Есть некоторая совершенно элементарная библиотека:

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

extern "C"
int __export MyFunc(void);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}


int MyFunc(void) {
return 56;
}


Компилится без ошибок (Borland C++), линкер выдает следующее:

Linker Error: Undefined symbol LIBMAIN in module c0d.ASM

Помогите разобраться. Заранее спасибо.
11
11 августа 2008 года
oxotnik333
2.9K / / 03.08.2007
File=>New=>Dll Wizard делал?
278
11 августа 2008 года
Alexander92
1.1K / / 04.08.2008
У меня немножко по-другому, но в настройках выставил, что хочу DLL.
278
11 августа 2008 года
Alexander92
1.1K / / 04.08.2008
Всем спасибо, проблема решена. :)
278
12 августа 2008 года
Alexander92
1.1K / / 04.08.2008
Помогите закончить. :) Скомпилил dll, в которой есть функция

int TestFunc(int i),

описанная как

extern "C" int __export TestFunc(int i)

(пользуюсь старым компилятором, директивы __declspec(dllexport) не понимает).
Тело ее выглядит элементарным образом:

int TestFunc(int i) {
if (i > 0)
return 1;
else
return 0;
}


После этого хочу в приложении получить к ней доступ:

typedef int (WINAPI *MyFunction)(int);
::MyFunction Test_Func;

void main(void) {
HINSTANCE MyDll = ::LoadLibrary("mydll.dll");
Test_Func = (MyFunction)::GetProcAddress(MyDll,"TestFunc");
int k = (*Test_Func)(5);
printf("%d\n", k);
}


Компилится нормально, линкуется нормально, при выполнении выдает ошибку:

TESTDLL1 вызвал общую ошибку защиты...,

а Test_Func оказывается равным NULL.

Помогите разобраться. Заранее спасибо.
11
12 августа 2008 года
oxotnik333
2.9K / / 03.08.2007
 
Код:
int (__stdcall *MyFunction)(int);
MyFunction = (int __stdcall(*)(int)) GetProcAddress(MyDll, "TestFunc");
278
12 августа 2008 года
Alexander92
1.1K / / 04.08.2008
А можно какой-нибудь простенький пример всего кода? Сори за нескромность. :)
278
12 августа 2008 года
Alexander92
1.1K / / 04.08.2008
Спасибо, уже разобрался. Там немножко по-другому:

 
Код:
int CALLBACK (*MyFunction)(int);
 HINSTANCE MyDll = LoadLibrary("mydll.dll");
 (void*)MyFunction = GetProcAddress(MyDll,"TestFunc");
51K
01 июля 2009 года
vanea1302
2 / / 01.07.2009
Pamghite plz!!!!
ne mogu zdelati sveazi s dll!!!
cod v dll:

//---------------------------------------------------------------------------

#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
int __export MyFunc(void);
extern "C" int __export TestFunc(int i);


#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
int Test(int i)
{
if(i>0)return 1;
return 0;
}
int MyFunc(void) {
return 56;
}
cod v forme1:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "FormDll.h"
#include <windowsx.h>
#include <windows.h>
#include <stdio.h>
#include "DllFile.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormDllTest *FormDllTest;

typedef int (WINAPI *MyFunction)(int);
::MyFunction Test_Func;
//---------------------------------------------------------------------------
__fastcall TFormDllTest::TFormDllTest(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TFormDllTest::Button1Click(TObject *Sender)
{
int (__stdcall *MyFunction)(int);
MyFunction = (int __stdcall(*)(int)) GetProcAddress(DllProject.dll, "TestFunc");
}
//---------------------------------------------------------------------------

on vidaiot "Uncnou file DllProject.dll"
11
01 июля 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: vanea1302
Pamghite plz!!!!
ne mogu zdelati sveazi s dll!!!
<поскипано>
on vidaiot "Uncnou file DllProject.dll"


LoadLibrary кто делать будет?
GetProcAddress(DllProject.dll <== сюда передается хендл длл-ки, загруженной через LoadLibrary
GetProcAddress(LoadLibrary("DllProject.dll" .... );
PS: посмотреть посты выше в этой теме + поиск + гугл + литература

518
02 июля 2009 года
Andreika
101 / / 14.02.2003
Цитата: vanea1302

on vidaiot "Uncnou file DllProject.dll"



Блин, можно писать транслитом, все понимаю, но английские слова тогда наверно лучше писать как они есть по английски. Долго думал что такое "Uncnou"...

Извините, что не по теме вопроса.

51K
03 июля 2009 года
vanea1302
2 / / 01.07.2009
Po netu iscal i nahadil malinchie samples pro dll dlea bcb6.
Prablema v tom shto ea polizuiusi CODEGEAR2009 i te codi ne o4eni furicile ( ne nahadile caciita include file) i ne mog evo zapustiti.

Daje tot h file on ne sazdaiot (u dll) i mesta ego ea stavliu cpp file...

sheas palucilasea tipa .... no ne o4eni :(

cod dll :
//---------------------------------------------------------------------------
#include <windowsx.h>
#include <windows.h>
#include <stdio.h>

extern "C" int __export MyFunc(void);
extern "C" int __export TestFunc(int i);
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------


int MyFunc(void) {
return 56;
}


int TestFunc(int i) {
if (i > 0)
return 1;
else
return 0;
}
------------
cod formi:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit4.h"
#include "File1.cpp"
#include <windowsx.h>
#include <windows.h>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm7 *Form7;

typedef int (WINAPI *MyFunction)(int);
::MyFunction Test_Func;

//---------------------------------------------------------------------------
__fastcall TForm7::TForm7(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm7::Button1Click(TObject *Sender)
{
HINSTANCE MyDll = ::LoadLibrary("Project1.dll");

int (__stdcall *MyFunction)(int);
MyFunction = (int __stdcall(*)(int)) GetProcAddress(MyDll, "TestFunc");
int k = (*MyFunction)(5);
}
//---------------------------------------------------------------------------





Prablema v tom sto esli sneati paslednii read (int k = (*MyFunction)(5);) to pri najatie cnopki vseo narmalina....
no esli astaviti to paivleaitsa error: "Acces violation at adress 00000000. Read of adress 0000000."
ea tak panimaiu shto on delait sveazi s dll no ne mojet impartiravati functiu....
pamaghite plz s atai prablemii
mojet ea shtota ne to delaiu, ne to dabavleaiu ....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог