Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.07;
Скачать: CL | DM;

Вниз

Указатели, структуры и DLL   Найти похожие ветки 

 
StarCon   (2003-03-28 14:49) [0]

Столкнулся с новой проблемой:
передача данных между приложением и dll происходит с помощью указателей на структуры. В данном примере в процедуру приходит указатель на структуру, содержащую данные. Я уже перепробовал множество способов, но результат один - структура пустая, что можете посоветовать?
это моя процедура:
procedure tran_process(pData: pointer; len: integer);
var GenTran: TGenTran;
begin
GenTran := TGenTranPoint(pData)^;
log_entry(2, pchar(StrPas(GenTran.myfile), 0);
log_entry(2, pchar(StrPas(GenTran.tranid), 0);
это моя структура:
type
TGenTranPoint = ^TGenTran;
TGenTran = packed record
myfile: array[0..9] of char;
date: longint;
tranid: array[0..3] of char;
sqnum: longint;
end;


 
Jel ©   (2003-03-28 14:56) [1]

Uses ShareMem, ....;

И в программе и в Dll.


 
Skier ©   (2003-03-28 15:22) [2]

Хорошо бы увидеть как ты создаёшь pData
и как вызываешь процедуру из DLL (соглашение о передаче параметров и т.д.)

И лучше сделать так :

procedure tran_process(pData: pointer; len: integer);
begin
if Assigned(pData) then begin
log_entry(2, pchar(StrPas(PGenTran(GenTran)^.myfile), 0);
log_entry(2, pchar(StrPas(PGenTran(GenTran)^.tranid), 0);
end; //if
это моя структура:
type
TGenTran = packed record
myfile: array[0..9] of char;
date: longint;
tranid: array[0..3] of char;
sqnum: longint;
end;
PGenTran = ^TGenTran;



 
StarCon   (2003-03-28 15:23) [3]

В DLL изменить не могу - исходников нет и написана она на С++
попробовал поставить в моем приложении - дело в том что мой ехе поднимается как один из процессов сервером, а после этого изменения он вообще перестал подниматься. с чем это связанно не знаю. нет ли другого варианта?


 
Skier ©   (2003-03-28 15:24) [4]

Поправка...
log_entry(2, pchar(StrPas(PGenTran(pData)^.myfile), 0);
//................


 
StarCon   (2003-03-28 15:30) [5]

Исходников DLL как я говорил нет
есть пример на С++, который прекрасно работает
структура в нем организованна так:
#pragma pack(1) /* make sure structures are packed */
typedef struct {
char file[10];
long date;
char tranid[4];
long sqnum;
} GEN_TRAN;
а функция:
void tran_process(char *data, short len)
{
GEN_TRAN* pgp;
pgp = (GEN_TRAN*) data;
все! теперь pgp->file - данные в порядке


 
Skier ©   (2003-03-28 15:35) [6]

TGenTran = packed record
myfile: array[1..10] of char;
date: longint;
tranid: array[1..4] of char;
sqnum: longint;
end;


 
Zelius ©   (2003-03-28 15:48) [7]

как ты объявляешь процедуру в своей программе? Похоже у тебя проблемы с соглашениями вызова процедуры. попробуй у себя добавить stdcall; после объявления.


 
StarCon   (2003-03-28 15:57) [8]

функции из dll используются с директивами cdecl; varargs;


 
StarCon   (2003-03-28 16:09) [9]

Skier, твой пример Access Violation дает...


 
Zelius ©   (2003-03-28 16:32) [10]

GenTran := TGenTranPoint(pData)^; - это не ошибка?
правильнее будет:
GenTran := TGenTranPoint(pData^);


 
StarCon   (2003-03-28 16:33) [11]

разименование pointer-а (^) неправильно
с начала надо привести pointer к другому типу


 
Zelius ©   (2003-03-28 17:33) [12]

ты абсолютно прав! только вот приводить надо не к TGenTranPoint, а к PGenTranPoint, где PGenTranPoint = ^TGenTranPoint.
В итоге есть два работающих варианта:
1) GenTran := PGenTranPoint(pData)^;
2) GenTran := TGenTranPoint(pData^);
Твой вариант, если TGenTranPoint не является указателем, не верен.





Страницы: 1 вся ветка

Текущий архив: 2003.04.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
14-19765
GDBoy
2003-03-19 21:44
2003.04.07
Помогите с треем....


14-19838
Malder
2003-02-27 23:31
2003.04.07
Большой куш (snatch)


1-19553
Fast
2003-03-27 02:14
2003.04.07
FormCreate


14-19813
Vlad Oshin
2003-03-19 10:57
2003.04.07
MS-DOS программа перестала работать.


1-19685
dimich1978
2003-03-26 09:50
2003.04.07
Чтение файла в память и сохранение.