AV при динамическом вызове функции из другого exe-файла
Пишу под 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
RegData^.TaskName := 'Task test';
RegData^.TaskVer := '1.666';
Если в записи есть параметры типа string, то работать не будет. Т.к. в типе string нулевой элемент это длинна строки и в него прямая запись запрещена. И другой процесс его записать не может.
Как вариант можно использовать массив символов.
Цитата:
Originally posted by HollyBlood
Свал происходит здесь:
RegData^.TaskName := 'Task test';
RegData^.TaskVer := '1.666';
Если в записи есть параметры типа string, то работать не будет. Т.к. в типе string нулевой элемент это длинна строки и в него прямая запись запрещена. И другой процесс его записать не может.
Как вариант можно использовать массив символов.
Свал происходит здесь:
RegData^.TaskName := 'Task test';
RegData^.TaskVer := '1.666';
Если в записи есть параметры типа string, то работать не будет. Т.к. в типе string нулевой элемент это длинна строки и в него прямая запись запрещена. И другой процесс его записать не может.
Как вариант можно использовать массив символов.
Так ведь в 98-й все работает!..
Цитата:
Originally posted by waterman
Так ведь в 98-й все работает!..
Так ведь в 98-й все работает!..
В 98-ой не проверял, но под НТ не проходит фокус 100%.