обратный вызов функции в DLL
От: Bistro  
Дата: 26.01.05 08:24
Оценка:
Помогите пожалиста!!!!

При обратном вызове из DLL (в нем модальный диалог) пользовательской функции из программы возникает ошибка "Access Violetion at 0x0...."
При рассмотрении видно, что ошибка возникает возможно по какому-то таймеру,
потому что часто указывает на Idle.
Мысли наводят на передачу Application.Handle в DLL, но ситуация не меняется
Второе предположение, что нельзя так использовать тип String при передаче из DLL
Короче — я в нокауте.

Код в программе
--------------------------------------------------
type
TDLLFunc=function(HApp:THandle; AUserFunction:pointer):TModalResult; stdcall;

TMyForm = class(TForm)
.......
procedure FormCreate(Sender: TObject);
.......
end;

var
MyForm: TMyForm;

implementation
const
cDLLName = 'testdll.dll';

Function UserFunction(InputVal, FuncName:String):String; stdcall;
begin
Result:='Тыры-пыры'+InputVal+FuncName;
end;

procedure TMyForm.FormCreate(Sender: TObject);
var
H: THandle;
F : TDLLFunc;
begin
......
H := LoadLibrary(cDLLName);
F := GetProcAddress(H, 'ShowFormInDll');
dmWizard := Self;
F(Application.Handle, @UserFunction);
FreeLibrary(H);
end;
===================================================

Код в DLLe, создающий диалог TMyWizardForm
---------------Main-----------------------------------
function ShowFormInDll(HApp:THandle; AUserFunction:pointer): TModalResult; stdcall;
begin
MyWizardForm := TMyWizardForm.Create(nil);
try
@UserFunction := AUserFunction;
try
Result := MyWizardForm.ShowModal;
except
Result := mrCancel;
end;
finally
MyWizardForm.Free;
end;
end;
---------------WizardForm unit-----------------------------------
type
TUserFunction = function (InputVal, FuncName:String):String; stdcall;

TMyWizardForm = class(TForm)
procedure FormShow(Sender: TObject);
end;

var
MyWizardForm: TMyWizardForm;
UserFunction: TUserFunction;

implementation

procedure TMyWizardForm.FormShow(Sender: TObject);
var St1:String
begin
St1:=UserFunction('Написано что-то', 'и еще что-то');
end;
========================================================

Заранее благодарен, Bistro




26.01.05 11:46: Перенесено модератором из 'Управление проектами' — Merle
Re: обратный вызов функции в DLL
От: Bistro  
Дата: 26.01.05 08:42
Оценка:
Простите, ребята, сам разобрался
— Заменил String на OleVariant при вызове функции и все покатило

Вспоминается бородатый анекдот про то как профессор говорит
"Я им пятый раз обяснил. Уже сам понял, а они еще нет..."
Re: обратный вызов функции в DLL
От: Softwarer http://softwarer.ru
Дата: 26.01.05 08:51
Оценка:
Здравствуйте, Bistro, Вы писали:

B> При обратном вызове из DLL (в нем модальный диалог) пользовательской функции из программы возникает ошибка "Access Violetion at 0x0...."


http://softwarer.ru/packages.html
Re: обратный вызов функции в DLL
От: Dimonka Верблюд  
Дата: 26.01.05 09:05
Оценка: :))
Здравствуйте, Bistro, Вы писали:

B>Помогите пожалиста!!!!


B> При обратном вызове из DLL (в нем модальный диалог) пользовательской функции из программы возникает ошибка "Access Violetion at 0x0...."


Да у тебя и Delphi с ашипками
Re[2]: обратный вызов функции в DLL
От: Spaider Верблюд  
Дата: 26.01.05 09:56
Оценка: :)
Здравствуйте, Dimonka, Вы писали:

D>Здравствуйте, Bistro, Вы писали:


B>>Помогите пожалиста!!!!


B>> При обратном вызове из DLL (в нем модальный диалог) пользовательской функции из программы возникает ошибка "Access Violetion at 0x0...."


D>Да у тебя и Delphi с ашипками


Хорошо хоть, что не голубой, а просто фиолетовый
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
--
К вашим услугам,
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.