Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передать переменную из программы в dll


Автор: Kostya-xp 5.2.2006, 01:13
Можно ли передать значение переменной из программы определенной процедуре, хранящейся в dll и затем вызвать её оттуда smile

Автор: Albinos_x 5.2.2006, 01:39
http://forum.vingrad.ru/index.php?showtopic=69246
Добавлено @ 01:41
http://forum.vingrad.ru/index.php?showtopic=81749


Автор: Kostya-xp 5.2.2006, 02:02
Albinos_x я не хочу программе передать сообщение, мне надо передать значение переменной из программы в ПРОЦЕДУРУ, КОТОРАЯ ХРАНИТСЯ В DLL и потом этой же программой вызвать её от туда.

smile smile
Добавлено @ 02:08
Вообщем во время того, как вызывается процедура из dll нужно передать ей значение переменной, которая находится в самой программе (т.е. EXE файле).

Автор: Partizan 5.2.2006, 02:09
ммм....а какие проблемы....? в C++ Builder это решается довольно просто....
подгружаем ДЛЛку получаем указатель на нужную функцию посредством GetProcAddress и вызываем её с нужными параметрами...

Автор: Kostya-xp 5.2.2006, 02:14
Partizan Напиши пример на Си пожалуйста smile

Автор: Partizan 5.2.2006, 02:19
пусть есть скомпиленная дллка с функцией:
Код

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

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "DLL_FUNCT.h"
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
void msg()
{
 ShowMessage(111);
}
//---------------------------------------------------------------------------



DLLFUNCT.h:

Код

#ifndef __MYDLL_H
#define __MYDLL_H

#ifdef __DLL__
#   define DLL_EI __declspec(dllexport)
#else
#   define DLL_EI __declspec(dllimport)
#endif

extern "C" void DLL_EI msg();

#endif


это у нас всё в ДЛЛ скомпилено....

а в проге делаем следуюшее:

Код

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "DLL_FUNCT.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void (__stdcall *MsgFunct)();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE dllInst = LoadLibrary("Project1.dll");

MsgFunct = (void (__stdcall*)())GetProcAddress(dllInst,"_msg");
MsgFunct();
FreeLibrary(dllInst);
}
//---------------------------------------------------------------------------


Автор: Poseidon 5.2.2006, 03:22
Пусть у нас в Dll есть процедура: procedure MyDllProcedyre(perem : integer);

Код

type 
  TMyProcedyre = procedure(perem : integer); // тип, который описывает процедуру в Dll

...

var
MyPerem: integer;  // наша переменная, каторую будем передавать.
hDll: THandle; // Handle библиотеки
MyProcedyre: TMyProcedyre; // наша процедура
begin
MyPerem:= 10; // присвоим знаение нашей переменной
hDll:= LoadLibrary('MyLib.dll'); // загрузим Dll
try
@MyProcedyre:= GetProcAddress(hDll, 'MyDllProcedyre'); // получим указател на нашу процедуру в Dll
MyProcedyre(MyPerem); // выполним процедуру, каторая в dll
finally FreeLibrary(hDll); end; // выгрузим dll
end;

Автор: Kostya-xp 5.2.2006, 19:21
Теперь все понятно. smile Всем БОЛЬШОЕ СПАСИБО!


M
Girder
Не надо баловать размером шрифта!
PS: Тема закрыта

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)