Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

AV при динамическом вызове функции из другого exe-файла

463
20 сентября 2003 года
waterman
178 / / 17.01.2003
Привет, олл. Помогите, плз. Непонятки творятся.

Пишу под Win2k. Есть два exeшника, оба написаны на D7. Один из них динамически вызывает функцию из другого (подгружая "вызываемый" экзешник вызовом LoadLibrary).

Фрагмент первого экзешника (вызывающего)
----------------------------------------

type
TRegisterFMSTaskFunc = function (RegData: PRegData): word; stdcall;

var
RegisterFMSTask: TRegisterFMSTaskFunc;
h: longint;
ProgDir: string;
RegData: TRegData;

...

begin
h := LoadLibrary(PAnsiChar(ProgDir + 'Tasks\' + sr.name));// sr.name - имя ЕХЕ-файла!
if h <> 0 then
begin
__@RegisterFMSTask := GetProcAddress(h, 'RegisterFMSTask');
__if @RegisterFMSTask <> nil then
__begin
____RegData.NeededRights := Rights;
____if RegisterFMSTask(@RegData) = 0 then
______lbTasks.Items.Add(RegData.TaskName + ' ver. ' + RegData.TaskVer);
__end;
__FreeLibrary(h);
end;

Здесь при вызове RegisterFMSTask(@RegData) вылезает "access violation at addr 0000. read of addr 0000". Хотя на Win98 все работает... Может, глюк 2к?

Фрагмент второго экзешника (вызываемого)
----------------------------------------

interface

...

function RegisterFMSTask(RegData: PRegData): word; stdcall; export;

...

exports RegisterFMSTask;

implementation

function RegisterFMSTask(RegData: PRegData): word; stdcall; export;
begin
RegData^.TaskName := 'Task test';
RegData^.TaskVer := '1.666';
result := 0;
end;// RegisterFMSTask
624
22 сентября 2003 года
HollyBlood
44 / / 20.06.2000
Свал происходит здесь:
RegData^.TaskName := 'Task test';
RegData^.TaskVer := '1.666';

Если в записи есть параметры типа string, то работать не будет. Т.к. в типе string нулевой элемент это длинна строки и в него прямая запись запрещена. И другой процесс его записать не может.

Как вариант можно использовать массив символов.
463
22 сентября 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by HollyBlood
Свал происходит здесь:
RegData^.TaskName := 'Task test';
RegData^.TaskVer := '1.666';

Если в записи есть параметры типа string, то работать не будет. Т.к. в типе string нулевой элемент это длинна строки и в него прямая запись запрещена. И другой процесс его записать не может.

Как вариант можно использовать массив символов.



Так ведь в 98-й все работает!..

624
23 сентября 2003 года
HollyBlood
44 / / 20.06.2000
Цитата:
Originally posted by waterman


Так ведь в 98-й все работает!..



В 98-ой не проверял, но под НТ не проходит фокус 100%.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог