Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

DLL для MS Access   Найти похожие ветки 

 
Kukushka-Q ©   (2008-09-12 17:57) [0]

Есть простелькая задача, запихнуть некоторые аудио данные из MP3-файлов в базу MS Access. С помощью библиотеки KOLATL сделана простенькая DLL, которая запускается из MS Access. В результате получем падение MS Access либо в процессе обращения, либо при закрытии. Первое, что приходит в голову - некорректно передаются/отдаются параметры и выгружается DLL. В Delphi я совсем чайник, поэтому прошу помочь разобраться.

Тестовый пример:

Код DLL на Delphi:

library DLLKOLATL;
{$X+}

uses
 ShareMem,
 SysUtils,
 KOL,
 ATLCommon,
 AudioMPEG;

{$R *.res}

function GetAudioInfo(const FN:PChar; var aBitrate:integer):wordbool;export;stdcall;
// вместо var пробовал out - эффект одинаковый

Var
 FName:String;
 mMPEGAudioInfo:TMPEGAudioInfo;
Begin
 FName:=trim(string(FN));
 mMPEGAudioInfo.Create;
 // mMPEGAudioInfo.ResetData;
 Result:=mMPEGAudioInfo.ReadFromFile(FName);
 if Result then begin
   aBitrate:=mMPEGAudioInfo.Bitrate;
 end else begin
   aBitrate:=0;
 end;
 mMPEGAudioInfo.Free;
 //mMPEGAudioInfo.Destroy; - это почему-то валит Access сразу
end;

exports
 GetAudioInfo;

begin
end.

Вызов в MS Access:

Declare Function GetAudioInfo Lib "DLLKOLATL.dll" (ByVal FName _
As String, ByRef maSampleRate As Long) As Boolean

Sub test_dll()

Dim ABitRate As Long
Dim FileName As String

ABitRate = 0
FileName = "D:\Test.mp3"
Debug.Print GetAudioInfo(FileName, ASampleRate)
Debug.Print ASampleRate

End Sub


 
Kukushka-Q ©   (2008-09-12 18:01) [1]

Маленькая корректировка:

Declare Function GetAudioInfo Lib "DLLKOLATL.dll" (ByVal FName _
As String, ByRef maSampleRate As Long) As Boolean

Sub test_dll()

Dim ABitRate As Long
Dim FileName As String

ABitRate = 0
FileName = "D:\Test.mp3"
Debug.Print GetAudioInfo(FileName, ABitRate)
Debug.Print ASampleRate

End Sub


 
mdw ©   (2008-09-12 19:18) [2]

Могу ошибаться, давно было, но насколько помню, когда мы связывались с аксесом и VB, то использовали Safecall. А передаваемую стоку описывали как Variant (As String). Думаю, PChar и String в бейсике есть разные типы. Передавайте указатель на память, потом ее обрабатывайте как PChar. А сперва попробуйте корректно вызвать процедуру, ничего не возвращая...


 
Kukushka-Q ©   (2008-09-12 20:16) [3]

Кажется что строка (т.е. в данном случае имя файла) как раз передается нормально (я же её как константу передаю и память должна сразу резервироваться в нужном объеме)... Access падает теперь при закрытии :(.

Замена stdcall на safecall к сожалению вызывает сообщение об ошибке: Bad DLL calling convension. Замена на variant заваливает MS Access сразу в момент обращения к DLL :(.

Блин, вроде всё должно быть элементарно, я уже голову сломал!


 
Дмитрий К ©   (2008-09-12 23:11) [4]

library Project1;

uses
 KOL,
 ATLCommon,
 AudioMPEG;

function GetAudioInfo(FN: PChar; var aBitrate: Integer): WordBool; export; stdcall;
var
 FName: string;
 mMPEGAudioInfo: PAudioInfo;
begin
 FName := FN;
//  MsgOK(FName);
//  MsgOK(Int2Str(aBitRate));
 mMPEGAudioInfo := NewAudioMPEG;
 try
   Result := mMPEGAudioInfo.ReadFromFile(FName);
   if Result then
     aBitrate := mMPEGAudioInfo.Bitrate
   else
     aBitrate := 0;
 finally
   mMPEGAudioInfo.Free;
 end;
end;

exports
GetAudioInfo;

begin
end.


 
Kukushka-Q ©   (2008-09-13 02:02) [5]

Спасибо. Заработало. Насколько я понял моя основная ошибка была в неправильном создании объекта и объявлении его типа. Надо было:
mMPEGAudioInfo: PAudioInfo;
...
mMPEGAudioInfo := NewAudioMPEG;



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
2-1266395128
urgun
2010-02-17 11:25
2010.08.27
TThread+TMemoryStream = исключения при чтении в буффер


2-1269160832
pavel_guzhanov
2010-03-21 11:40
2010.08.27
Как проверить, что элемент массива пустой?


15-1269080805
tippa
2010-03-20 13:26
2010.08.27
английский и программирование


15-1271053363
TRSteep
2010-04-12 10:22
2010.08.27
Кнопка "Новая папка" на панели инструментов


15-1265202683
DillerXX
2010-02-03 16:11
2010.08.27
Ток розжига кварцевой лампы