| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > dll |
| Автор: vikaz 17.4.2006, 09:37 |
| народ, возникла такая проблемка. Пишу 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 17.4.2006, 10:57 |
| странный способ указатели на функцию объявлять... http://www.codenet.ru/progr/bcb/dll.php |
| Автор: vikaz 17.4.2006, 11:43 |
| статья тоже не ахти!!!! коменты настрараживают. Попробую. А что тебе конкретно не понравилось в моем коде!!!?? |
| Автор: _hunter 17.4.2006, 11:59 |
| читаемость... + можно __stdcall поприкручивать. |
| Автор: vikaz 17.4.2006, 12:04 |
| кстати чем отличается __fastcall от __stdcall? |
| Автор: _hunter 17.4.2006, 13:22 |
| при первом аргументы идут в регистрах ( покак зватает ) при втором -- в стеке Добавлено @ 13:23 естественно первый немного быстрее |