int (__stdcall *MyFunction)(int);
MyFunction = (int __stdcall(*)(int)) GetProcAddress(MyDll, "TestFunc");
Написание DLL
#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
Помогите разобраться. Заранее спасибо.
File=>New=>Dll Wizard делал?
У меня немножко по-другому, но в настройках выставил, что хочу 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.
Помогите разобраться. Заранее спасибо.
Код:
А можно какой-нибудь простенький пример всего кода? Сори за нескромность. :)
Код:
int CALLBACK (*MyFunction)(int);
HINSTANCE MyDll = LoadLibrary("mydll.dll");
(void*)MyFunction = GetProcAddress(MyDll,"TestFunc");
HINSTANCE MyDll = LoadLibrary("mydll.dll");
(void*)MyFunction = GetProcAddress(MyDll,"TestFunc");
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"
Цитата: vanea1302
Pamghite plz!!!!
ne mogu zdelati sveazi s dll!!!
<поскипано>
on vidaiot "Uncnou file DllProject.dll"
ne mogu zdelati sveazi s dll!!!
<поскипано>
on vidaiot "Uncnou file DllProject.dll"
LoadLibrary кто делать будет?
GetProcAddress(DllProject.dll <== сюда передается хендл длл-ки, загруженной через LoadLibrary
GetProcAddress(LoadLibrary("DllProject.dll" .... );
PS: посмотреть посты выше в этой теме + поиск + гугл + литература
Цитата: vanea1302
on vidaiot "Uncnou file DllProject.dll"
Блин, можно писать транслитом, все понимаю, но английские слова тогда наверно лучше писать как они есть по английски. Долго думал что такое "Uncnou"...
Извините, что не по теме вопроса.
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 ....