Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll, dll 
:(
    Опции темы
vikaz
Дата 17.4.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



народ, возникла такая проблемка. Пишу Dll'ку вот ее код:
cpp файл
------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include "UMyDLL.h"
#pragma hdrstop
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//---------------------------------------------------------------------------
char * Code_Dec (char *s, char Key)
{
 strcpy (s,"123");
 return s;
}
//---------------------------------------------------------------------------
int My_dll_2 (int i)
{
 
 ShowMessage (i);
 return i;
}
///////////////////////////////////////////////////////////////////
h файл
#ifndef _UMYDLL_H
#define _UMYDLL_H
#ifdef __DLL__
# define DLL_EI __declspec(dllexport)
#else
# define DLL_EI __declspec(dllimport)
#endif

extern "C" char * DLL_EI Code_Dec(char *s, char Key);
extern "C" int DLL_EI My_dll_2(int i);

#endif

вот сам код который вызывает эту dll

#include <vcl.h>
#pragma hdrstop

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

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 dllInstance = LoadLibrary("MyDLL.dll");
 if (dllInstance)
 {C_D = (FType *) GetProcAddress (dllInstance, "_Code_Dec");
 C_D_1 = (FType_1 *) GetProcAddress (dllInstance, "_My_dll_2");}
 else ShowMessage ("Библиотека не загружена");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 FreeLibrary (dllInstance);
 C_D = NULL;
 C_D_1 = NULL;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 if (C_D)
 {Edit2->Text =C_D (Edit2->Text.c_str(), 'A');
 Edit1->Text = IntToStr (C_D_1(2));} 
 else ShowMessage ("Функция не найдена");    
}
//---------------------------------------------------------------------------

h файл

private:    // User declarations
                    HINSTANCE dllInstance;
                    typedef char (__import * FType(char *s, char Key));
                    typedef int (__import * FType_1(int i));
                    FType_1 *C_D_1;
                    FType * C_D;

сам вопрос,  по нажатию на кнопку Button3 в первом случае выдается 123 в edit2
а вот в edit1 появляется 1, хотя сообщение выскакиевает с 2, почему в edit1 ложится 1?
P.S. насчет данной строки не загоняйтесь Edit2->Text =C_D (Edit2->Text.c_str(), 'A'); это просто переработанный код, а значения которые передаются в функцию, просто мусор smile 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
_hunter
Дата 17.4.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



странный способ указатели на функцию объявлять...
http://www.codenet.ru/progr/bcb/dll.php 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
vikaz
Дата 17.4.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



статья тоже не ахти!!!!
коменты настрараживают. Попробую. А что тебе конкретно не понравилось в моем коде!!!?? 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
_hunter
Дата 17.4.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



читаемость...
+ можно __stdcall поприкручивать. 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
vikaz
Дата 17.4.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



кстати чем отличается __fastcall от __stdcall? 


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
_hunter
Дата 17.4.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



при первом аргументы идут в регистрах ( покак зватает ) при втором -- в стеке

Добавлено @ 13:23 
естественно первый немного быстрее 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.