Соответствующую структуру данных можно сконструировать. Делаете так. Во-первых, передаете PChar — указатель на первый элемент строки. Во-вторых, в предыдущих четырех байтах перед первым символом строки должен лежать int с длиной этой строки (без завершающего 0). В еще более предыдущих четырех байтах нужно организовать int со значением 1.
Если после вызова функции предпредыдущий int сохранит значение 1 — считайте, Вам повезло. Это значит, что функция нигде не запомнила эту строку в глобальных структурах, и метод сработает. Если это значение изменилось — значит, так лучше не делать, поскольку указатель на Вашу память сохранился и далее будет пытаться использоваться.
Re: Вызов на VC++ функцию из DLL, написанной на Delphi
Здравствуйте, Sevig, Вы писали:
S>Пожалуйста помогите правильно вызвать на VC++ функцию из DLL, написанной на Delphi
S>Как передается паскалевский string ?
type
StrRec = record
allocSiz: Longint;
refCnt: Longint;
length: Longint;
end;
S>function SetClientName(const Client: string): HRESULT;
S>
Т.е., для строки надо распределить SizeOf(StrRec)+Length(s) байт,
заполнить allocSiz = length, refCnt=1 (не важно для const), а далее
заполнять самой нультерминируемой строкой (PChar).
Передавать в функцию следует адрес таким образом заполненного блока.
В случае пустой строки этот указатель ссылается на nil.
--
С уважением, LVT
Re: Вызов на VC++ функцию из DLL, написанной на Delphi
Здравствуйте, Sevig, Вы писали:
S>А как на Delphi пишется CALLBACK функция, описанная как : S>TLevel0PacketEvent = procedure(iPortId: byte; Packet: PPacket) of object; S>Она должна быть методом класса ?
Ээ.. Очень трудно понять смысл вопроса.
Пишется — без проблем
Такое объявление процедурного типа подразумевает именно метод класса. То есть переменной такого типа легко присваивается метод с соответствующими параметрами, а чтобы присвоить "просто подпрограмму", приходится потрудиться.
Вызвать такое из VC++ — не особенно понятно зачем, но в принципе можно.
Информацию на эту тему можно посмотреть в моей статье.
Re[2]: Вызов на VC++ функцию из DLL, написанной на Delphi
S>TLevel0PacketEvent = procedure(iPortId: byte; Packet: PPacket) of object;
S>
S>Она должна быть методом класса ?
Я, вроде бы, подробно отвечал в winapi 08.10.04.
В чем, собс-но, проблем?
--
С уважением, LVT
Re[3]: Вызов на VC++ функцию из DLL, написанной на Delphi
От:
Аноним
Дата:
13.10.04 09:12
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT> В чем, собс-но, проблем?
Да на Delphi, я ничего не писал, синтаксиса не знаю, вот только поставил и экпериментирую...
На Си с вызовами всех функций, кроме CALLBACK все получилось (ASM стабы писал для каждой фунции и раскидывал параметры) Ваша вырезка из хелпа очень помогла. Посмотрю на Delphi как CALLBACK работает, если не смогу на Си сделать, сделаю DLL обертку на Delphi. Спасибо за помощь....
Re: Вызов на VC++ функцию из DLL, написанной на Delphi
Уф... вроде все заработало, но одна странная непонятность.
Если ожидание CALLBACK в основном потоке выполняю с помощью Sleep(...), то CALLBACKи не вызываются вообще....
Заменяю ожидание на обычный MessageBox(), все прекрасно летает и работает...
Сишный проект откомпилирован с Multi-threaded Runtime library, обертка на Delphi c настройками по умолчанию..
Ничего не понимаю....
Re[2]: Вызов на VC++ функцию из DLL, написанной на Delphi
Здравствуйте, Sevig, Вы писали:
S>Сишный проект откомпилирован с Multi-threaded Runtime library, обертка на Delphi c настройками по умолчанию..
Хм. Вообще говоря, все существенно зависит от того, что Вы ожидаете и что делается. Судя по тому, что Вы написали — Sleep тормозит поток, который нужен для обработки сообщений.
Вообще говоря, я несколько не понимаю, что есть "ожидать callback с помощью sleep". Возможно, конечно, это некая особая техника MSVC В любом случае — надо детально смотреть, что Вы делаете, что делает вызываемая функция и чего Вы ожидаете.
Re[3]: Вызов на VC++ функцию из DLL, написанной на Delphi