Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при использовании модуля BTMemoryModule 
:(
    Опции темы
Sckrejjet
  Дата 21.3.2014, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день  smile 
Решил заняться такой "чудесной" вещью, как вшивание DLL в ресурс, а потом динамически ее выгружать при запуске приложения в память(с помощью модуля BTMemoryModuleUnicode), уже долго с ним "дрался", но, наконец, понял(вроде бы), как он работает... И, вроде бы, все правильно, но компилятор выдает вот такие гадости:

Первая ошибка:
user posted image

Выделяется строка №217
Код

  try
{217}mDLL:= BTMemoryLoadLibary(mem, dlSz);
    if mDLL <> nil then


Весь код целиком я выложил ниже smile

Вот вторая ошибка:
user posted image

Происходит это здесь:
user posted image

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

Кто-нибудь знает, что тут происходит?  smile 

Весь код (Ошибка на строке 217)
Код

unit Drum;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, {bass,} IniFiles, ShellApi, PngImage, BTMemoryModuleUnicode,
  Vcl.ExtCtrls;
const
  BASSVERSION = $204;         //-----
  BASS_UNICODE = $80000000;   //-----
 
type
  HCHANNEL = DWORD; //-----
  Tsound = array [1..10] of TResourceStream;
  Tchan  = array [1..10] of HCHANNEL;
 
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormDestroy(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure LoadImage(ps: string; pa, pb: integer; var pimage:TImage);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure LibraryLoading();
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  s:HCHANNEL;
  sound:Tsound;
  chan:Tchan;
  Ini:TIniFile;
 
  BASS_Init:function(device: integer; freq, flags: cardinal; win: cardinal; clsid: pGUID):bool; stdcall;
  BASS_Free:function: bool; stdcall;
  BASS_StreamCreateFile:function(mem: bool; f: Pointer; offset, length: int64; flags: cardinal): cardinal; stdcall;
  BASS_StreamFree:function(handle: cardinal): bool; stdcall;
  BASS_ChannelPlay:function(handle: cardinal; restart: bool): bool; stdcall;
  BASS_ChannelStop:function(handle: cardinal): bool; stdcall;
  BASS_ChannelPause:function(handle: cardinal): bool; stdcall;
  BASS_GetVersion:function():DWord;  //-----
  BASS_ErrorGetCode:function():LongInt; //-----
  
  h:array [1..10] of string = ('r1','r2','r3','r4','r5','r6','r7','kick','snare','shot');
implementation
 
{$R *.dfm}
{$R 'RES.res'}
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'del.ini');
  Ini.WriteInteger('inf','drums_delete',1);
  Ini.Free;
  ShellExecute(Application.Handle,PChar('open'),PChar(ExtractFilePath(Application.ExeName)+'Launcher.exe'),Nil,Nil,SW_SHOW);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  r1,r2,r3,r4,r5,r6,r7,kick,snare,shot:PChar;
  i: Integer;
  png:TPNGImage;
begin
  LibraryLoading;
  png:=TPngImage.Create;
  png.LoadFromResourceName(HInstance,'DRUM');
  Image1.Canvas.Draw(0,0,png);
  png.Free;
  Image2.Canvas.Brush.Color:=clRed;
  Image2.Canvas.Rectangle(0,0,18,18);
  Image2.Canvas.Pen.Color:=clBlack;
  Image2.Canvas.MoveTo(4,4);
  Image2.Canvas.LineTo(15,15);
  Image2.Canvas.MoveTo(4,14);
  Image2.Canvas.LineTo(15,3);
 
  if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
    begin
        MessageBox(0,'An incorrect version of BASS.DLL was loaded',nil,MB_ICONERROR);
        Halt;
    end;
 
    if not BASS_Init(-1, 44100, 0, Handle, nil) then
        ShowMessage('Error initializing audio!');
 
  for i := 1 to 10 do
    begin
      sound[i]:=TResourceStream.Create(HInstance,h[i],PChar('WAVE'));
      chan[i]:=BASS_StreamCreateFile(true,sound[i].Memory,0,sound[i].Size,0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
      if chan[i]=0 then
        begin
          beep;
          showmessage('zz');
        end;
      Form1.Caption:=IntToStr(BASS_ErrorGetCode());
    end;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
//  Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'del.ini');
//  Ini.WriteInteger('inf','drums_delete',1);
//  Ini.Free;
//  ShellExecute(Application.Handle,PChar('open'),PChar(ExtractFilePath(Application.ExeName)+'Launcher.exe'),Nil,Nil,SW_SHOW);
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  png:TPNGImage;
begin
  case key of
    Ord('1'): //500x138
      begin
        Bass_ChannelPlay(chan[1],true);
        LoadImage('P_R1',500,138,Image1);
      end;
      
    Ord('2'):
      begin
        Bass_ChannelPlay(chan[2],true);
        // Code will be here :-)
      end;
      
    Ord('3'): //72x33
      begin
        Bass_ChannelPlay(chan[3],true);
        LoadImage('P_R3',72,33,Image1);
      end;
      
    Ord('4'):
      begin
        Bass_ChannelPlay(chan[4],true);
        // Code will be here :-)
      end;
    Ord('5'):
      begin
        Bass_ChannelPlay(chan[5],true);
        // Code will be here :-)
      end;
      
    Ord('6'):
      begin
        Bass_ChannelPlay(chan[6],true);
        // Code will be here :-)
      end;
      
    Ord('7'):
      begin
        Bass_ChannelPlay(chan[7],true);
        // Code will be here :-)
      end;
      
    Ord('8'): //222x250  (kick)
      begin
        Bass_ChannelPlay(chan[8],true);
        LoadImage('P_KICK',222,250,Image1);
      end;
      
    Ord('9'): //400x200  (snare)
      begin
        Bass_ChannelPlay(chan[9],true);
        LoadImage('P_SNARE',400,200,Image1);
      end;
      
    Ord('0'): //350x102  (shot)
      begin
        Bass_ChannelPlay(chan[10],true);
        LoadImage('P_SHOT',350,102,Image1);
      end;
  end;
end;
 
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  png:TPNGImage;
begin
  png:=TPngImage.Create;
  png.LoadFromResourceName(HInstance,'DRUM');
  Image1.Canvas.Draw(0,0,png);
  png.Free;
end;
 
procedure TForm1.Image2Click(Sender: TObject);
begin
  Form1.Close;
end;
                       
procedure TForm1.LibraryLoading;
var
  rm:TResourceStream;
  mem: pointer;
  dlSz: integer;
  mDLL: PBTMemoryModule;
begin
  try
    rm:= tResourceStream.Create(hInstance,'dll',RT_RCDATA);
    rm.Position := 0;
    dlSz:=rm.Size;
    mem := GetMemory(dlSz);
    rm.Read(mem^, dlSz);
    rm.Free;
  except
    ShowMessage('Someshit happened while RES load: ' + SysErrorMessage(GetLastError));
    if rm <> nil then rm.Free;
    exit;
  end;
  try
    mDLL:= BTMemoryLoadLibary(mem, dlSz); //-----------ОШИБКА ТУТ
    if mDLL <> nil then
      begin
        @BASS_Init:=BTMemoryGetProcAddress(mDLL,'BASS_Init');
        @BASS_Free:=BTMemoryGetProcAddress(mDLL,'BASS_Free');
        @BASS_StreamCreateFile:=BTMemoryGetProcAddress(mDLL,'BASS_StreamCreateFile');
        @BASS_StreamFree:=BTMemoryGetProcAddress(mDLL,'BASS_StreamFree');
        @BASS_ChannelPlay:=BTMemoryGetProcAddress(mDLL,'BASS_ChannelPlay');
        @BASS_ChannelStop:=BTMemoryGetProcAddress(mDLL,'BASS_ChannelStop');
        @BASS_ChannelPause:=BTMemoryGetProcAddress(mDLL,'BASS_ChannelPause');
        @BASS_GetVersion:=BTMemoryGetProcAddress(mDLL,'BASS_GetVersion');
        @BASS_ErrorGetCode:=BTMemoryGetProcAddress(mDLL,'BASS_ErrorGetCode');
      end;
  except
    ShowMessage('Someshit happened while DLL load: ' + BTMemoryGetLastError);
  end;
  if mDLL <> nil then BTMemoryFreeLibrary(mDLL);
  FreeMemory(mem);
end;
 
procedure TForm1.LoadImage(ps: string; pa, pb: integer; var pimage:TImage);
var
  png:TPNGImage;
begin
  png:=TPNGImage.Create;
  png.LoadFromResourceName(HInstance,ps);
  pimage.Canvas.Draw(pa,pb,png);
  png.Free;
end;
 
end.

PM MAIL   Вверх
stanilar
Дата 24.3.2014, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В окне CallStack можно возвать мышью PopUp диалог для каждого вызова, и посмотреть View Local Variables, что там будут за значения?
PM MAIL   Вверх
Sckrejjet
Дата 24.3.2014, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте smile

по поводу:
Цитата

В окне CallStack можно возвать мышью PopUp диалог для каждого вызова, и посмотреть View Local Variables, что там будут за значения?


Там очень много различных значений... Многие разветвляются на дочерние и т.д... На какие именно значения смотреть?

Может быть эти?

Это в ветке FOnCreate  в окошке переменных:
code: $5CBFB4
data: $3043720

Это сообщение отредактировал(а) Sckrejjet - 24.3.2014, 14:52
PM MAIL   Вверх
stanilar
Дата 24.3.2014, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Странно ты вопросы оформляешь. Что возвратил BTMemoryGetLastError - не пишешь.

Написал больше всего про вторую ошибку, а первая важнее. Вторая может возникнуть при повреждении памяти от первой ошибки. Что за функция BTMemoryLoadLibary тоже непонятно.


Вот такое читал?
PM MAIL   Вверх
Sckrejjet
  Дата 24.3.2014, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(stanilar @ 24.3.2014,  16:35)
Странно ты вопросы оформляешь. Что возвратил BTMemoryGetLastError - не пишешь.

Написал больше всего про вторую ошибку, а первая важнее. Вторая может возникнуть при повреждении памяти от первой ошибки. Что за функция BTMemoryLoadLibary тоже непонятно.


Вот такое читал?

Извините, быть может это действительно глупые вопросы... И, не исключаю, что ошибка не в модуле, а в том месте, откуда растут мои руки... Но я новичок и поэтому обратился за помощью к людям, которые, безусловно, знают программирование лучше, чем я...  smile 

Цитата

Что за функция BTMemoryLoadLibary тоже непонятно.


Это функция из модуля BTMemoryModuleUnicode, аналог функции LoadLibrary. Меня тоже насторожило отсутствие буквы "L", но я залез в этот модуль и, действительно там так написано. 

Я поднял BTMemoryGetLastError выше, чтобы точно получить код ошибки, так вот, он ничего не выдает... Пустое окошко...

Я прикрепил исходник программы, который выполняет только загрузку DLL(без доп. функций, т.к. они работают исправно). Там же уже откомпилированный RES файл с библиотекой BASS.dll, модуль BTMemoryModuleUnicode.
Еще есть пара файлов в папке доп. мат.

исходники

Если можете, пожалуйста, посмотрите опытным взглядом на эти ошибки... В любом случае, заранее, огромное Вам спасибо!  smile 

Это сообщение отредактировал(а) Sckrejjet - 25.3.2014, 00:10
PM MAIL   Вверх
stanilar
Дата 25.3.2014, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прочти сначала материал по работе с ошибками. Думаю после него и вопрос решится, и программировать станет интересней.

А насчет того в модуле ли ошибка или в руках ответить легко: примеры идущие с библиотекой работают? Может они не подходят для твоей версии Delphi.

Кстати, судя по всему ты работаешь в XE, а BTMemoryModuleUnicode последний раз обновлялся в 2005. Может поискать что поновее? Думается что в джедаях должен быть аналог.

Скорее всего твой вопрос должен был начаться с "посоветуйте компонент".



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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