Как Передать Переменную В Dll Из Вызывающей Программы?

  • Автор темы sys21nt
  • Дата начала
S

sys21nt

#1
Доброго времени суток всем.Пишу на C++Builder CodeGeard2009.Буквально только начал учиться,а посему сильно не пинайте если что не так=).
Так вот.Не получаеться передать переменную из вызывающей dll программы.(Т.е. переменная передаёться в точку входа в dll,а дальше в прикрученную мной DataModule1 не передаётся.)Прикрутил к dll DataModule так,чтоб понять как всё работает,вот смотрите.
Вот собсвенно и мой код.
File1.cpp(Это dll)
//---------------------------------------------------------------------------
#define BUILD_DLL
//#include "File2.h"

#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "Unit1.h"
#include "File2.h"

#pragma argsused

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//----------------------------------------
File2.h(Это dll)
#ifndef _File2_H
#define _File2_H

#ifdef __DLL__
# define DLL_EI __declspec(dllexport)
#else
# define DLL_EI __declspec(dllimport)
#endif
//extern "C" void __declspec(dllexport) ShowForm(int i);
//DLL_EI int i; //??
#endif
//--------------------------------------------
Unit1.cpp//Это DataModule1 в dll
#include <vcl.h>
#pragma hdrstop
#include "File2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ZipForge"
#pragma resource "*.dfm"
TDataModule1 *DataModule1;
//---------------------------------------------------------------------------
__fastcall TDataModule1::TDataModule1(TComponent* Owner)
: TDataModule(Owner)
{
}
extern "C" void __declspec(dllexport) ShowForm(int i);
void ShowForm(int i)
{
ShowMessage(i); //Сюда передаёться i,а дальше нет. :)
TDataModule1 *DataModule1=new TDataModule1(0);
DataModule1->OnCreate;
delete DataModule1;
}
//---------------------------------------------------------------------------
void __fastcall TDataModule1::DataModuleCreate(TObject *Sender)
{
ShowMessage(i);//Вот сюда не передаёться i из вызываемой программы!!!!!!Помогиет ПЛИЗ!!! ;)
}
//---------------------------------------------------------------------------
Unit1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "ZipForge.hpp"

//---------------------------------------------------------------------------
class TDataModule1 : public TDataModule
{
__published: // IDE-managed Components
void __fastcall DataModuleCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TDataModule1(TComponent* Owner);
//int i;
};
//---------------------------------------------------------------------------
extern PACKAGE TDataModule1 *DataModule1;
//---------------------------------------------------------------------------
extern "C" void __declspec(dllexport) ShowForm(int i);
#endif

//-----------------------
Программа вызова dll
//-----------------------
Unit2.cpp
#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{

typedef void __declspec(dllexport) TypeShowForm(int i);
TypeShowForm *ShowForm;
HINSTANCE hDll = LoadLibrary("datadll.dll");
if(hDll)
{
ShowForm = (TypeShowForm*) GetProcAddress(hDll,"_ShowForm");
if(ShowForm)
{
i=StrToInt(Edit1->Text);
ShowForm(i);
}
FreeLibrary(hDll);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
i=23;
dllH = LoadLibrary("datadll.dll");//загрузить библиотеку("путь")
if (dllH)
funcH = (FuncType*)GetProcAddress(dllH,"_ShowForm");//получение доступа к ф-ии
else
ShowMessage("Не удалося!");
//int *c =
funcH(i);//вот ее использование

FreeLibrary(dllH); //после работы с dll необходимо освобождать память
}
//---------------------------------------------------------------------------

Unit2.h
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TEdit *Edit1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
public:
HINSTANCE dllH;//дескриптор подключаемой dll
typedef int(_import * FuncType (int));//объявлние переменной типа функции, к которой надо обратиться в dll.
////typedef [return_type] (*type_name) (params,...);
FuncType * funcH;//новый экземпляр (переменная) типа, описывающего тип самой импортируемой функции


__fastcall TForm2(TComponent* Owner);
int i;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif

Что я не так делаю?
 
S

sys21nt

#2
:huh: Неужели нет никого ктобы мог помочь мне в этом вопросе?? :)
Не проходите мимо.