Re: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Softwarer http://softwarer.ru
Дата: 07.10.04 12:29
Оценка: 2 (1)
Здравствуйте, Sevig, Вы писали:

Соответствующую структуру данных можно сконструировать. Делаете так. Во-первых, передаете PChar — указатель на первый элемент строки. Во-вторых, в предыдущих четырех байтах перед первым символом строки должен лежать int с длиной этой строки (без завершающего 0). В еще более предыдущих четырех байтах нужно организовать int со значением 1.

Если после вызова функции предпредыдущий int сохранит значение 1 — считайте, Вам повезло. Это значит, что функция нигде не запомнила эту строку в глобальных структурах, и метод сработает. Если это значение изменилось — значит, так лучше не делать, поскольку указатель на Вашу память сохранился и далее будет пытаться использоваться.
Re: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Leonid Troyanovsky  
Дата: 08.10.04 11:02
Оценка: 2 (1)
Здравствуйте, 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[3]: Вызов на VC++ функцию из DLL, написанной на Delphi
От: ZrenBy Россия  
Дата: 07.10.04 12:17
Оценка: +1
Здравствуйте, Sevig, Вы писали:

S>У меня есть готовая DLL на Delphi. Я ее функии вызываю из программы на VC++, и не знаю как передавать параметры...


Напиши DLL-обертку на Delphi с PChar
Вызов на VC++ функцию из DLL, написанной на Delphi
От: Sevig Россия  
Дата: 07.10.04 11:56
Оценка:
Добрый день !

Пожалуйста помогите правильно вызвать на VC++ функцию из DLL, написанной на Delphi

Как передается паскалевский string ?
На Delphi она выглядит так:



function SetClientName(const Client: string): HRESULT;



Я представляю примерно так:



typedef HRESULT (__fastcall  *SetClientNameProc)(LPTSTR); 

SetClientNameProc        SetClientName;
LoadLibrary("*.dll");
SetClientName = (SetClientNameProc) GetProcAddress(hInstance, "SetClientName"); 
HRESULT H=SetClientName("aaaaaa");
FreeLibrary(hInstance);



Как передавать строку, я не знаю ... Был бы тип PChar.....

Спасибо за помощь !
Re: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Kh_Oleg  
Дата: 07.10.04 12:04
Оценка:
Здравствуйте, Sevig, Вы писали:

S>Пожалуйста помогите правильно вызвать на VC++ функцию из DLL, написанной на Delphi

S>Как передается паскалевский string ?
S>На Delphi она выглядит так:
S>
S>function SetClientName(const Client: string): HRESULT;
S>

S>Как передавать строку, я не знаю ... Был бы тип PChar.....

А что мешает в Delphi принимать тип PChar?
Re[2]: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Sevig Россия  
Дата: 07.10.04 12:12
Оценка:
Здравствуйте, Kh_Oleg, Вы писали:


K_O>А что мешает в Delphi принимать тип PChar?


У меня есть готовая DLL на Delphi. Я ее функии вызываю из программы на VC++, и не знаю как передавать параметры...
Re: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Sevig Россия  
Дата: 12.10.04 13:30
Оценка:
А как на Delphi пишется CALLBACK функция, описанная как :



TLevel0PacketEvent = procedure(iPortId: byte; Packet: PPacket) of object;


Она должна быть методом класса ?

Спасибо !
Re[2]: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Softwarer http://softwarer.ru
Дата: 12.10.04 13:37
Оценка:
Здравствуйте, Sevig, Вы писали:

S>А как на Delphi пишется CALLBACK функция, описанная как :

S>TLevel0PacketEvent = procedure(iPortId: byte; Packet: PPacket) of object;
S>Она должна быть методом класса ?

Ээ.. Очень трудно понять смысл вопроса.

Пишется — без проблем

Такое объявление процедурного типа подразумевает именно метод класса. То есть переменной такого типа легко присваивается метод с соответствующими параметрами, а чтобы присвоить "просто подпрограмму", приходится потрудиться.

Вызвать такое из VC++ — не особенно понятно зачем, но в принципе можно.

Информацию на эту тему можно посмотреть в моей статье.
Re[2]: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Leonid Troyanovsky  
Дата: 12.10.04 16:56
Оценка:
Здравствуйте, Sevig, Вы писали:

S>

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
От: Sevig Россия  
Дата: 18.10.04 07:50
Оценка:
Уф... вроде все заработало, но одна странная непонятность.

Если ожидание CALLBACK в основном потоке выполняю с помощью Sleep(...), то CALLBACKи не вызываются вообще....
Заменяю ожидание на обычный MessageBox(), все прекрасно летает и работает...

Сишный проект откомпилирован с Multi-threaded Runtime library, обертка на Delphi c настройками по умолчанию..



Ничего не понимаю....
Re[2]: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Softwarer http://softwarer.ru
Дата: 18.10.04 07:59
Оценка:
Здравствуйте, Sevig, Вы писали:

S>Сишный проект откомпилирован с Multi-threaded Runtime library, обертка на Delphi c настройками по умолчанию..


Хм. Вообще говоря, все существенно зависит от того, что Вы ожидаете и что делается. Судя по тому, что Вы написали — Sleep тормозит поток, который нужен для обработки сообщений.

Вообще говоря, я несколько не понимаю, что есть "ожидать callback с помощью sleep". Возможно, конечно, это некая особая техника MSVC В любом случае — надо детально смотреть, что Вы делаете, что делает вызываемая функция и чего Вы ожидаете.
Re[3]: Вызов на VC++ функцию из DLL, написанной на Delphi
От: Sevig Россия  
Дата: 18.10.04 09:56
Оценка:
Здравствуйте, Softwarer, Вы писали:

S> Возможно, конечно, это некая особая техника MSVC


угу.. поиздеваться бы только над чайниками...

Конечно, создал консольное тестовое приложение... и еще sleep повесил....

Pardon, абздался.... че то заработался....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.