Роботы, плагины и скрипты к чату MyChat. Разработка альтернативных клиентов и различных утилит. Технические вопросы по программированию, замечания и предложения по развитию API
Evgeniy
Есть ли 64 битная версия dll ?
Аватара пользователя
Алексей Пикуров
Здравствуйте, Евгений.

А чем 32x не устраивает?
Аватара пользователя
Алексей Пикуров
Я попробовал собрать x64 вариант, "сходу" не вышло. Но, в принципе, реализуемо, если ваше приложение есть исключительно в x64 варианте.
Evgeniy
Алексей Пикуров писал(а):Здравствуйте, Евгений.

А чем 32x не устраивает?


Здравствуйте Алексей.

Для одного вашего нового клиента пытаюсь сделать интеграцию с сервером Oracle. Сервер Oracle 64-битный. и он не работает с 32-битными dll библиотеками.

Когда можно ожидать 64 битной версии. Мне нужно знать, чтобы спланировать работу по интеграции.
Аватара пользователя
Алексей Пикуров
Здравствуйте, Евгений.

Я попробую сделать x64 DLL библиотеку для вас. Отпишусь в этой теме. Сегодня-завтра.
Аватара пользователя
Алексей Пикуров
Получилось. Качайте и пробуйте - http://www.nsoft-s.com/files/mychat/int ... pi/sdk.zip

Внутри примеры на Delphi XE3. В архиве и 32-х и 64-разрядные версии библиотеки.
Evgeniy
C 64 библиотекой ошибку подключения не выдает. Но тем не менее пока подключить не удалось.

Предполагаю, что дело в типах данных. При подключении к ораклу dll приходится делать ее обкрутку с типами данными C.
Полагаю возникают проблемы с типами данных, а также с используемым соглашением вызова safecall.

Я еще поколдую (хотя надежд на успех не много), но сразу хочу уточнить нет ли возможности использовать cdecl или pascal ?
Аватара пользователя
Алексей Пикуров
Тот вариант передачи строк, что используем мы, должен работать, он универсален, подходит и для С и для Pascal-style. Покажите свой код, подумаем вместе.
Evgeniy
Не думаю, что поможет. Я же не сам программирую доступ, а настраиваю оракловые механизмы ,
но если хотите (это обкрутки, которые создаются в plsql для использования их в коде):

Код: Выделить всё
FUNCTION mychatGetLibVersion return varchar2 as
    External
    LIBRARY mychat NAME "mychatGetLibVersion64"
    parameters(
    RETURN STRING
    )
    LANGUAGE C CALLING STANDARD PASCAL;



Судя по тому, что я нашел про safecall:
safecall просто создаёт вокруг тела процедуры блок try-except-end, в котором исключение переводится в HRESULT.


я пробовал и другие варианты объявления данной процедуры. С out параметром (т..е если исходить из логики что
Код: Выделить всё
function DoSomething(a: DWORD): DWORD; safecall;  
это тоже что
function DoSomething(a: DWORD; out Result: DWORD): HResult; stdcall;

):

Код: Выделить всё
  
  FUNCTION mychatGetLibVersion2 (res out varchar2 ) return varchar2 as
    External
    LIBRARY mychat NAME "mychatGetLibVersion64"
    parameters(
    res maxlen,
    res length,
    res STRING,
   
    RETURN STRING
    )
    LANGUAGE C CALLING STANDARD PASCAL;   



Также цитата из документации оракловой :
Restrictions on External C Procedures

Currently, the following restrictions apply to external procedures:

This feature is available only on platforms that support DLLs.
Only C procedures and procedures callable from C code are supported.
You cannot pass PL/SQL cursor variables or records to an external procedure. For records, use instances of object types instead.
In the LIBRARY subclause, you cannot use a database link to specify a remote library.
The maximum number of parameters that you can pass to a external procedure is 128. However, if you pass float or double parameters by value, then the maximum is less than 128. How much less depends on the number of such parameters and your operating system. To get a rough estimate, count each float or double passed by value as two parameters.


и про поддерживаемые стандарты вызова:
CALLING STANDARD

Specifies the Windows NT calling standard (C or Pascal) under which the external procedure was compiled. (Under the Pascal Calling Standard, arguments are reversed on the stack, and the called function must pop the stack.) If you omit this subclause, then the calling standard defaults to C.


возможные типы данных:
http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg11rtn.htm#1009249
Аватара пользователя
Алексей Пикуров
Я отделил тему, почитаю документацию по вашим ссылкам.
Аватара пользователя
Алексей Пикуров
Почитал, особо понимания не появилось :) У меня нет опыта программирования DLL библиотек для Оракла, к сожалению. Вам нужен специалист в этом вопросе.
Однако, почему в коде plsql
Код: Выделить всё
FUNCTION mychatGetLibVersion return varchar2 as
    External
    LIBRARY mychat NAME "mychatGetLibVersion64"
    parameters(
    RETURN STRING
    )
    LANGUAGE C CALLING STANDARD PASCAL;

вы пишете
LANGUAGE C CALLING STANDARD PASCAL;

Что это означает?

http://docs.oracle.com/cd/A58617_01/ser ... _procs.htm
Написано:
CALLING STANDARD

Specifies the Windows NT calling standard (C or Pascal) under which the external procedure was compiled. (Under the Pascal Calling Standard, arguments are reversed on the stack and the called function must pop the stack.) If you omit this subclause, the calling standard defaults to C.

Т.е. достаточно просто написать "LANGUAGE C". И всё. DLL библиотека написана по Сишным стандартам, специально для удобства.

P.S. Да и, судя по документации, можно слова "LANGUAGE C" тоже опустить, они по умолчанию подразумеваются.
Evgeniy
Да конечно, я пробовал разные варианты в том числе и без указания соглашения вызова.

Суть в том, что safecall - это не стандартное соглашение вызова для с.

По поводу обращения к специалисту - собственно ко мне и обратились. Другие библиотеки подключаются.

Т.е. получается на текущий момент у нас есть следующие возможности:
1) Вы пытаетесь переделать dll на другой стандарт.
2) Мы пишем свою библиотеку для общения с сервером - я видел у вас вроде расшарен протокол. Но тут мне нужно общаться с заказчиком на предмет увеличения стоимости работ тогда.
3) Мы предполагаем, что текущую dll можно подключить. Но это Заказчик уже видимо ищет другого Исполнителя.

Вопрос к Вам исходя из Ваших ресурсов - сможем ли мы работать по варианту 1 ?
Аватара пользователя
Алексей Пикуров
Я не гуру в С, поэтому:
1. Вы можете предоставить Delphi-вариант исходника DLL библиотеки, который 100% работает для вашей задачи? Функции, которые передают и принимают строки (не только числа)?
2. Тоже вариант, протокол открыт, можете работать. Если будут какие-то вопросы, я помогу.

Свяжитесь со мной Скайпом, обсудим детали, возможно, получиться что-то придумать.
alexey.pikurov
Evgeniy
Алексей Пикуров писал(а):Я не гуру в С, поэтому:


Я тоже не гуру в С. Да и дельфи никогда хорошо не знал. Но вот удалось найти следующую информацию :

http://www.sql.ru/forum/659476/dll-c-i-delphi-problema-s-vozvratom-znacheniya

Т.е. я так понял, что для корректного восприятия библиотеки, написанной на дельфи, в C - нужно следующее:

1) safecall поменять или дополнить на cdecl.
Как здесь например :
http://www.sql.ru/forum/90585/kak-pravilno-sozdat-dll-chtoby-podkluchit-ee-v-foxpro?mid=662673#662673

2) widestring сменить на PChar я так понял.

3) возможно убрать возвращаемые значения и переделать на out параметры, но я думаю это не принципиально.