Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизУказатели, структуры и 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c