Главная страница
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.06 c
2-1270099947
gvozdkoff
2010-04-01 09:32
2010.08.27
сравнение 2-х строк, если они равны то вывод формы-сообщения


2-1269445511
Kurilkin
2010-03-24 18:45
2010.08.27
TFrame


15-1264580056
12
2010-01-27 11:14
2010.08.27
А кто-то во что-то играет?Интересуют неглупые стрелялки от 1 лица


15-1264902636
Tuk
2010-01-31 04:50
2010.08.27
Как уменьшить такую конструкцию?


2-1272341393
Игорь
2010-04-27 08:09
2010.08.27
GetProcessAffinityMask