![]() |
|
|
![]()
|
|
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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'); это просто переработанный код, а значения которые передаются в функцию, просто мусор -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
статья тоже не ахти!!!!
коменты настрараживают. Попробую. А что тебе конкретно не понравилось в моем коде!!!?? -------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
читаемость...
+ можно __stdcall поприкручивать. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| vikaz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 869 Регистрация: 15.2.2006 Репутация: 10 Всего: 12 |
кстати чем отличается __fastcall от __stdcall?
-------------------- ![]() Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
при первом аргументы идут в регистрах ( покак зватает ) при втором -- в стеке
Добавлено @ 13:23 естественно первый немного быстрее -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |