Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2011, 22:26   #1
lamak
C++
Пользователь
 
Регистрация: 31.10.2009
Сообщений: 30
Сообщение Простая dll-библиотека С++

Задание - нужно создать dll-библиотеку для определения максимума 2 чисел и подключить ее к основной программе. Вроде все сделал по книжке, но при нажатии на кнопку возникает ошибка доступа к памяти.

Код функции:
Код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int x = StrToInt(Edit1->Text), y = StrToInt(Edit2->Text);

  HINSTANCE dllInstance = LoadLibrary("dll_proj.dll");
   typedef int (__import *FType(int, int));
   FType * Func_max;

   if (dllInstance)
        Func_max = (FType *)GetProcAddress(dllInstance, "_max");
   else 
        ShowMessage("Error in import 'dll_proj.dll' ");

   Label1->Caption = IntToStr(Func_max(x,y));
   FreeLibrary("dll_proj.dll");
}
Полный код библиотеки
Код:
#include <windows.h>
#pragma hdrstop

#define _APPMAINCPP
#include "lab1_dll_h.h"

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}

 extern "C" int __stdcall __declspec(dllexport) max(int, int);

   int __export max (int a, int b)
{  if (a > b)  return a;
   else return b;
   }
Код header'a:
Код:

#define DLL_SPEC extern "C" __export

DLL_SPEC int __stdcall max(int a, int b);
Верю в google...
lamak вне форума Ответить с цитированием
Старый 07.02.2011, 06:39   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

extern "C", насколько я помню, отменяет name mangling, т.е. max() так и останется max(), а не превратится в _max(). Добавьте проверку:

Код:
if (dllInstance) {
  //
  Func_max = (FType *)GetProcAddress(dllInstance, "_max");
  if (!Func_max)
    ShowMessage("Здається, ми щось наплутали з name mangling");
}
else 
  ShowMessage("Error in import 'dll_proj.dll' ");
Ну и __stdcall, в половине мест он есть, в половине нет. Даже если это не ошибка, я бы или везде его добавил, или везде убрал.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
библиотека DLL Federal Помощь студентам 17 05.08.2010 15:23
Библиотека графических эффектов в dll. Alex Cones Общие вопросы Delphi 34 20.06.2010 16:12
DLL-библиотека Lisёноk Помощь студентам 2 29.04.2010 22:00
DLL библиотека Владимир1988 Помощь студентам 1 17.11.2009 17:15
библиотека bass.dll larry Win Api 2 31.07.2009 15:37