Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование С в ХП / 13 сообщений из 13, страница 1 из 1
11.08.2005, 14:07
    #33210485
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
Скорее всего вопрос уже не раз обсуждался поэтому прошу прощения заранее но в виду неработоспособности сайта вплане поиска , всетаки решаюсь его задать.
Проблема в общем-то в следующем:
Имеется dll ф-я откомпилированная на CBuilder 6 со следующем исходным кодом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <windows.h>
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return  1 ;
}
//---------------------------------------------------------------------------
__declspec(dllexport) int add_one(int arg)
{
    return ++arg;
}

Пытаюсь обьявить ф-ю в Постгрессе:
Код: plaintext
1.
2.
3.
CREATE FUNCTION add_one(integer) RETURNS integer
     AS '$libdir/1', 'add_one'   language 'C'
        with (isstrict);

Выходит ошибка: Errore could not load library C:/Program Files/PostgreSQL/8.0/lib/1.dll
Хотя естественно именно там она и лежит.

Заранее благодарен за любой ответ !
...
Рейтинг: 0 / 0
11.08.2005, 16:44
    #33211063
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
Patriot...Имеется dll ф-я откомпилированная на CBuilder 6 со следующем исходным кодом.......


Не знаю чем смогу помочь...но то, что знаю...
1) необходимо проверить ссылки получаемой дэлеле на другие модули. По первости желательно всё перенести прям в подкоталог откель грузиться экзэшник (путь по умолчанию). путь по которому делаеться загрузка вашей дэлеле, по нему (лично мне) не удалось заставить подгружать другие модули.
2) экспортируемое имя... проверить без подчёркивания ли оно обьявляеться... Либо подправить деклорацию, либо по старинке - создать дэф файл и т.д...
3) не знаю насколько помогу, но обьявляю в сишниках таким макаром...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include "stdafx.h"
#include "postgres.h"
#include "fmgr.h"
#include "executor/spi.h"
#include "Loader.h"

PG_FUNCTION_INFO_V1(wait);

Datum wait(void)
{
  Sleep( 3000 );
  PG_RETURN_VOID();
} 

4) можно добавить, что явно указываю путь загрузки - но то не обязаловка, как я понимаю (если модуль в стандартных либах постгресса)...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
11.08.2005, 16:48
    #33211078
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
и ышо....
типы передаваемых/возвращаемых значений на данной фазе побоку...постгресс именно не находит связки "имя файла-имя функции" либо то, что "не пускает" - ссылки на другие библиотеки.

(круглый)
...
Рейтинг: 0 / 0
12.08.2005, 08:41
    #33211960
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
kolobok0

По первости желательно всё перенести прям в подкоталог откель грузиться экзэшник (путь по умолчанию). путь по которому делаеться загрузка вашей дэлеле, по нему (лично мне) не удалось заставить подгружать другие модули.



Экзэшника то как такогового нет ... подключаю также доп.модули например tsearch2 похоже тут дело в длл-ке ... Не пойму вот только что ...
Интересно как вообще в винде кто их компилит ?
...
Рейтинг: 0 / 0
12.08.2005, 12:17
    #33212636
mef
mef
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
могу ошибаться, но dll - ки нужно компилировать с правильными ключами.

http://www.postgresql.org/docs/8.0/interactive/xfunc-c.html
31.9.6. Compiling and Linking Dynamically-Loaded Functions

или Вы так и делали?
...
Рейтинг: 0 / 0
12.08.2005, 17:41
    #33213712
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
PatriotЭкзэшника то как такогового нет ...

имелось ввиду экзешник самого постгресса.
он подымаеться на каждый коннект отдельно. Вот в его адрессное пространство и грузиться весь Ваш (наш - не важно) хлам под названием дэлеле...

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
15.08.2005, 09:19
    #33214871
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
mefмогу ошибаться, но dll - ки нужно компилировать с правильными ключами.

http://www.postgresql.org/docs/8.0/interactive/xfunc-c.html
31.9.6. Compiling and Linking Dynamically-Loaded Functions

или Вы так и делали?

Да так и делал ... Наверное не так много программистов работает с постгрессом под виндой :(
...
Рейтинг: 0 / 0
15.08.2005, 13:56
    #33215609
mef
mef
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
а слэш в другую сторону ставить не пробовали, и путь абсолютный указать попроще C:\1\
...
Рейтинг: 0 / 0
15.08.2005, 14:25
    #33215696
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
Все попробовал ... тут все-таки дело в самой длл-ке ...
...
Рейтинг: 0 / 0
15.08.2005, 17:37
    #33216244
mef
mef
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
ну, чудес не бывает :)) вот в офиц. руководстве доброжелатель коммент оставил, может поможет
....
5) Write the CREATE FUNCTION with double backslashes (\)for the dir separators. Postgres needs them escaped.

CREATE OR REPLACE FUNCTION add_one(INTEGER)
RETURNS INTEGER
LANGUAGE C
STABLE
RETURNS NULL ON NULL INPUT
AS 'C:\PGSQL\PGEXTEND\ADDONE.dll', 'add_one';

NOTES: These are pitfalls.
1) Make sure Visual C++ made the DllMain() function for you.
2) Make sure every exported SQL function in in a C-linkage block:
extern "C" { ... };
3) CREATE FUNCTION does not allow spaces in the DLLs path. Consider adding a special path to store postgres DLLs, with all uppercase and no whitespace.
...

сам я под линуксам писал/подключал - вроде не было проблем.
Удачи.
...
Рейтинг: 0 / 0
15.08.2005, 19:56
    #33216462
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
PatriotВсе попробовал ... тут все-таки дело в самой длл-ке ...

имя дэлеле полное ?
1.dll

1) попробуйте натравить на неё
Depends
Прям в подкоталоге либов... Она Вам все зависимые покажет и расскажет, могёт ли загрузить али нет.
2) Возможно сделать так... взять компильнуть экзе проэкт (который ссылаеться на Вашу дэлеле). подложить в подкоталог либ...позвать... посмотреть встаёт либо нет...

да и ещё...
есть соображение, что дополнительные дэлеле (если есть неявная загрузка - см. ключи компиляции на предмет юзанья библиотек) НЕ будут грузиться из подкоталога либ... Как проверка - перенеси их в подкоталог, где находиться сам экзешник постгресса. бин, если по умолчанию...

загрузка всех дэлеле на которые есть неявные ссылки, производиться при регистрации экстендед функции.


с уважением
(круглый)
...
Рейтинг: 0 / 0
16.08.2005, 11:19
    #33217282
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
Обязательно попробую вышеизложенное ... спасибо !
...
Рейтинг: 0 / 0
16.08.2005, 14:25
    #33218081
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование С в ХП
Была неправильно написана dll-ка ... вот ведь парадокс ... скомпилировл туже либу под дельфой ... естественно переписав на Паскаль и все заработало ...
Всем спасибо вопрос снимается ...
Надо компилить dll написанные на С на Visual C++.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование С в ХП / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]