Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "KOL";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.063 c
2-1269419918
oleg1963lora
2010-03-24 11:38
2010.08.27
Время вставки строк. Нужна идея!


10-1166695535
Nick6
2006-12-21 13:05
2010.08.27
XLReport и DCOM


15-1269409783
TUser
2010-03-24 08:49
2010.08.27
Школа vs гугл :)


2-1275629001
Sergey2
2010-06-04 09:23
2010.08.27
Service


2-1269906662
Дмитрий
2010-03-30 03:51
2010.08.27
обработка пакета сервера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский