Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
14-19832
Bboy
2003-03-20 19:58
2003.04.07
Вопрос по Ворду


1-19529
Pavel_
2003-03-26 14:25
2003.04.07
выполенние процедуры по указателю


1-19594
dronas555
2003-03-28 17:17
2003.04.07
Добавление информации в файл.


1-19582
Tornado
2003-03-28 13:25
2003.04.07
ДОС-команда


3-19409
_BasiL_
2003-03-17 13:32
2003.04.07
Кто работал с halcyon





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский