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

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем sys21nt, 12 апр 2012.

  1. sys21nt

    sys21nt Гость

    Доброго времени суток всем.Пишу на 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

    Что я не так делаю?
     
  2. sys21nt

    sys21nt Гость

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

Поделиться этой страницей