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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2009, 21:18   #1
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
Лампочка Ошибка при выхове функций Bass.dll из другой DLL

Доброго времени суток! У меня такая проблема...
использую библиотеку Bass.dll. Создал свою библиотеку которая использует функции из bass.dll...
А теперь когда использую функции со своей библиотеки, то они выдают ошибку...

Вот код:

Кусок моей библиотеки:
Код:
uses
  Windows, bass;

procedure APK_CPUUsageInit;
begin
  if MHNDL = 0 then
  begin
    MHNDL := GetModuleHandle('ntdll.dll');
    if @NtQuerySystemInformation = nil then
      NtQuerySystemInformation := GetProcAddress(MHNDL,
        'NtQuerySystemInformation');
    TimeBot := 0;
    UsageBot := 0.00;
  end;
end;

function APK_GetCPUUsage: Double;
begin
  Result := UsageBot;
  if @NtQuerySystemInformation <> nil then
  begin
    TimeCur := GetTickCount();
    if TimeCur - TimeBot < 500 then
      Exit
    else
    begin
      TimeBot := TimeCur;

      status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo,
      SizeOf(SysBaseInfo), nil);
      if status <> 0 then
      Exit;

      status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo,
      SizeOf(SysTimeInfo), nil);
      if status <> 0 then
      Exit;

      status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo,
      SizeOf(SysPerfInfo), nil);
      if status <> 0 then
      Exit;

      if (liOldIdleTime.QuadPart <> 0) then
      begin

        // CurrentValue = NewValue - OldValue
        dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) -
          Li2Double(liOldIdleTime);
        dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) -
          Li2Double(liOldSystemTime);

        // CurrentCpuIdle = IdleTime / SystemTime
        dbIdleTime := dbIdleTime / dbSystemTime;

        // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
        dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors
          + 0.5;

      end;

      // store new CPU's idle and system time
      liOldIdleTime := SysPerfInfo.liIdleTime;
      liOldSystemTime := SysTimeInfo.liKeSystemTime;

      UsageBot := dbIdleTime;
      Result:= dbIdleTime;
    end;
  end;
end;

procedure APK_CPUUsageFree;
begin
  if @NtQuerySystemInformation <> nil then
  begin
    @NtQuerySystemInformation := nil;
    FreeLibrary(MHNDL);
    TimeBot := 0;
    UsageBot := 0.00;
    MHNDL := 0;
  end;
end;

function APK_Init(device: LongInt; freq, flags: DWORD; win: HWND; clsid: PGUID): BOOL;
begin
  Result := BASS_Init(device, freq, flags, win, clsid);
end;

exports 
  APK_CPUUsageInit,
  APK_GetCPUUsage,
  APK_CPUUsageFree,
  BASS_Init;
Присоеденяю её к программе статически. И когда использую в своей программе например функции APK_CPUUsageInit или APK_GetCPUUsage или APK_CPUUsageFree, то всё работает, а как только вызываю функцию APK_Init которая использует внутри себя функции из Bass.dll, то выдает вот такую ошибку программа как на рисунке ниже, а то и вообще падёт...



Подскажите пожалуйста что это может быть? Я же всё правильно делаю!
все библиотеки и моя и Bass.dll находятся в одном каталоге с программой...
SalasAndriy вне форума Ответить с цитированием
Старый 21.10.2009, 21:45   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
exports 
  APK_CPUUsageInit,
  APK_GetCPUUsage,
  APK_CPUUsageFree,
  BASS_Init;
Цитата:
а как только вызываю функцию APK_Init
чет странно как то...
похоже что все норм=)
вы не экспортировали её
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2009, 21:48   #3
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Цитата:
вы не экспортировали её
ой сори... поправочка...

Код:
exports 
  APK_CPUUsageInit,
  APK_GetCPUUsage,
  APK_CPUUsageFree,
  APK_Init;
допустил ошибку... у меня вот так стоит! и не работает...
и такая ошибка происходит со всеми функциями моей DLL из которых вызываются функции Bass.dll
http://www.programmersforum.ru/showthread.php?t=5999
Выдаёт тоже самое исключение...

Последний раз редактировалось SalasAndriy; 21.10.2009 в 21:57.
SalasAndriy вне форума Ответить с цитированием
Старый 21.10.2009, 22:01   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

посмотрите модуль bass.pas который у вас включен в юзес,
попробуйте вызывать функции сами...без модуля этого.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2009, 22:08   #5
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

пробывал... Я и сам думал что какой-то косяк там... но создал проект подключил bass.pas юзал некоторые функции и работает отлично... Музыку воспроизводит! И без всяких исключений... всё коректно работает. А вот когда пытаюсь вызывать эти функции через библиотеку, начинает ругаться:
Код:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 000607C6. Read of address 000607C6'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
Такое чувство что Bass.dll не разрешает использовать свои функции из другой DLL, а только напрямую из программы...
Такое возможно?

Последний раз редактировалось SalasAndriy; 21.10.2009 в 22:10.
SalasAndriy вне форума Ответить с цитированием
Старый 21.10.2009, 22:24   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

просто пас может быть расчитан на применение именно внутри приложения...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2009, 22:55   #7
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Ну вот пробывал кое что...
Если зделал вот так в своей библиотеке:
Код:
function APK_Init(device: LongInt; freq, flags: DWORD; win: HWND; clsid: PGUID): BOOL;
var
  Channel: DWORD;
begin
  BASS_Init(device, freq, flags, win, clsid);
  BASS_Start;
  Channel := BASS_StreamCreateFile(False, 'roxette_-_habla_el_corazon.mp3', 0, 0, 0);
  BASS_ChannelPlay(Channel, False);
  Result := True;
end;
И теперь когда вызываю эту функцию APK_Init выдаёт тоже исключение но играет музыка!
Значит всё-таки можно проиграть... Но когда всё по одельности нехочет...
SalasAndriy вне форума Ответить с цитированием
Старый 21.10.2009, 23:36   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

используйте try except и определите виновника...
а там посмотрите реалицию в модуле(pas)
если она стандартная то тогда не знаю
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BASS.DLL VintProg Мультимедиа в Delphi 2 21.09.2009 16:36
Ошибка при загрузке dll nikmay Общие вопросы Delphi 10 25.06.2009 15:42
Ошибка при загрузке DLL dani92 Общие вопросы Delphi 12 24.04.2009 14:54
DLL. Ошибка при Form1.Free Roof Общие вопросы Delphi 3 26.07.2008 01:21
bass.dll - ошибка - Use the step or run to continue. vitalik007 Общие вопросы Delphi 1 20.08.2007 19:59