powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
20 сообщений из 20, страница 1 из 1
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282645
madmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПОМОГИТЕ!!!!
Оригинал прототипа ф-ции на С
int SetDir( const char * path );
как я только не пробовал объявлять в Declare Global External Functions прототип этой ф-ции, и чё только

не пробовал передавать......и всегда получал вот такую ошибку:

Application terminated.
Error: Specified argument type differs from required argument type at runtime in DLL function SetDir.

(invalid stack pointer on return from function call) at line 20 in clicked event of ob]ect cb_l of

w_main.

Для примера приведу пару примеров закончившихся получением этой ошибки:
прототип FUNCTION int SetDir(string path) LIBRARY "xapi.dll" или в
прототипе как ref string path или сhar path[] или blob path

Чё это за ошибка? Как правильно написать .....или чё воще делать?
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282646
Фотография alienzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем тебе эта ф. то? есть же в PB аналог !!!
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282651
madmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всмысле аналог? Мне надо выполнить в PB ф-цию из внешней DLLки ....а я вот обламываюсь и всё!!! Вроде и объявил как надо, а всё равно еррор выдаёт! Я знаю прототип к этой ф-ции на Си-шке, а на PB чёто не заводится!!! Пробовал из VC++ выполнять, то ф-ция работает! Мож я чё нетак объявил и ли не так параметры передал??? I need help!!! :)
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282654
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А она у тебя
Код: plaintext
__stdcall 
?
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282656
madmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чесно говоря все внешние ф-ции которые я раньше подключал были лиш парочка API ф-циями! :( Так чё я далеко не профи в Этом деле, и понятия не имею, что значит __stdcall ...... Эсли не затруднить объясните в двух словах! Что зделать?
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282665
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PowerBuilder поддерживает только DLLы с функциями экспортированными используя __stdcall calling convention (многие компайлеры используют __cdecl convention по умолчанию)

Если компилишься как C++, a не C, тогда декларируй экспортируемые функции как extern "C", т.е.:

// Declare the function, probably in a header file
extern "C" _declspec(dllexport) int __stdcall Test();

// Define the function
extern "C" _declspec(dllexport) int __stdcall Test()
{
// your code here
}

Кроме того, чтобы экспортировать твои функции без '__stdcall name
mangling' используй module definition file (*.DEF). (The __stdcall calling
convention prepends a leading underscore, and appends '@xxx', to the
function name, where the xxx in @xxx in the size, in bytes, of the
function's parameters). Например:

;***************************************************************************
*
;* dlltest.def - Module Definition File
;***************************************************************************
*

LIBRARY DLLTEST

DESCRIPTION "Your description goes here"

EXPORTS
Test=_Test@0

Just include the *.DEF file in your project.
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282666
madmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем так! Как бы я не пробовал использовать эту внешнюю ф-цию - всегда созерцаю вот такую ошибку:

Application terminated.
Error: Specified argument type differs from required argument type at runtime in DLL function SetDir.

(invalid stack pointer on return from function call) at line 20 in clicked event of ob]ect cb_l of

w_main.

Если не затруднит, то объясните что зделать , что б ф-ция заработала? Заранее ПАСИБА!
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32282669
madmax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть в наявности к этой готовой DLL-ке .lib , .h ну и сам .dll файл! Могу ли что то зделать с ними , что может мне помоч запустить ф-цию с длл-ки??? :(
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #32296955
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определи параметр не как
Код: plaintext
(string path)
а как
Код: plaintext
(ref string path)

Это должно тебе помочь.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33936839
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппPowerBuilder поддерживает только DLLы с функциями экспортированными используя __stdcall calling convention (многие компайлеры используют __cdecl convention по умолчанию)
...
Кроме того, чтобы экспортировать твои функции без '__stdcall name
mangling' используй module definition file (*.DEF).

Недавно делали dll-ну (на msvc 6), которая экспортирует функцию для использования в ПБ 9.0.3. Эта функция принимает параметры (число, строку), возвращает число.

Всё заработало с использованием префикса __stdcall в объявлении функции и описания её в def-файле.. но без def-файла ничего не выходит!

вопрос (не очень надо, просто интересно ): можно ли обойтись без описания функции в def-файле?
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33936913
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergey wrote:

> Недавно делали dll-ну (на msvc 6), которая экспортирует функцию для
> использования в ПБ 9.0.3. Эта функция принимает параметры (число,
> строку), возвращает число.
>
> Всё заработало с использованием префикса __stdcall в объявлении функции
> и описания её в def-файле.. но без def-файла ничего не выходит!
>
> *вопрос* (не очень надо, просто /интересно/): можно ли обойтись без
> описания функции в def-файле?

Лень пробовать самому (я не Сишник), но я бы попробовал что-то типа:

extern "C"
{
long WINAPI MyCoolFunc(long lParm, const char *sParm);
}

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33936937
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
madmaxУ меня есть в наявности к этой готовой DLL-ке .lib , .h ну и сам .dll файл! Могу ли что то зделать с ними , что может мне помоч запустить ф-цию с длл-ки??? :(
Как я понимаю исходников DLL у вас нет?
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33937285
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000
savosin_sergey wrote:

Лень пробовать самому (я не Сишник), но я бы попробовал что-то типа:

extern "C"
{
long WINAPI MyCoolFunc(long lParm, const char *sParm);
}


не работает, пробовали

Estets
Как я понимаю исходников DLL у вас нет?

есть :) то связано с постом о переводе картинки буфера обмена в jpg

- описание исходников --------------
0. функция long GetImagefromCB (string filepath, long quality) предназначена для сохранения изображения, находящегося в буфере обмена в jpg-файл с заданным качеством

1. сборка dll
- надо скачать ftp.oviont.sokol.ru/cximage.rar
- открыть в msvc6 файл CxImgLib.dsw
- нажать F7 (должен быть активныйм прект clib, конaигурация release
- в clib\release появится clib.dll
- def-файл находится в clib\clib.def
- исходник clib.dll в demo2\console.cpp

2. подключение к PB
Код: plaintext
1.
Function long GetImagefromCB (string filepath, long quality) Library "clib"

3. использование в PB
Код: plaintext
1.
2.
3.
4.
5.
int i_ret
long i_quality
i_quality =  90 
filepath = "D:\ASPP_ST\Main\pbl\TMENU\1.jpg"
i_ret = GetImagefromCB(filepath, i_quality)

библиотека cximage взята с codeproject.com
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33937714
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том проекте .Def просто лежит в каталоге и не подключен в проект.
Поэтому имя в DLL получается неюзабельное: "?GetImagefromCB@@YGHPADH@Z"

В самой DLL ф-я описана верно:
Код: plaintext
__declspec(dllexport) int __stdcall GetImagefromCB (char* filepath, int quality)

В PB я бы описал так :
Код: plaintext
Function long GetImagefromCB (ref string filepath, long quality) Library "clib"


PS. И ссылка на архив неверная :)
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33937907
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВ том проекте .Def просто лежит в каталоге и не подключен в проект.

ну не подключён -- это результат утомительных опытов "на ощупь". с def-файлом всё работает.

я решил, что def-файл -- старьё (раньше даже win16-приложение надо было собирать с def-файлом: для того, чтобы какой-то stub прилинковался -- сам я не пробовал, вычитал в книжках), и обойти всякими extern "C", или ещё какими-нибудь командами компилятору..
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33937914
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
PS. И ссылка на архив неверная :)
ссылка да, с ошибкой, вот вроде без ошибки
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33938302
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergey Anatoly MoskovskyВ том проекте .Def просто лежит в каталоге и не подключен в проект.

ну не подключён -- это результат утомительных опытов "на ощупь". с def-файлом всё работает.

я решил, что def-файл -- старьё (раньше даже win16-приложение надо было собирать с def-файлом: для того, чтобы какой-то stub прилинковался -- сам я не пробовал, вычитал в книжках), и обойти всякими extern "C", или ещё какими-нибудь командами компилятору..

Без .DEF только так:
Код: plaintext
1.
2.
extern "C" __declspec(dllexport) int __stdcall GetImagefromCB (char* filepath, int quality)
Function long GetImagefromCB (ref string filepath, long quality) Library "clib" Alias For "_GetImagefromCB@8"
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33938544
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergey вопрос (не очень надо, просто интересно ): можно ли обойтись без описания функции в def-файле?Нет, нельзя. Def файл дает тебе возможность сделать переименование любого экспортируемого имени. Без def-файла такое переименование сделать невозможно.
Что за странная нелюбовь к def'ам?
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33938696
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Без .DEF только так:
Код: plaintext
1.
2.
extern "C" __declspec(dllexport) int __stdcall GetImagefromCB (char* filepath, int quality)
Function long GetImagefromCB (ref string filepath, long quality) Library "clib" Alias For "_GetImagefromCB@8"

спасибо! нда, видно в хелп не судьба мне было посмотреть..

но тогда зачем extern "C" ? без него просто манглы будут страшней:
Код: plaintext
Function ... Library "clib" Alias for "?GetImagefromCB@@YGHPADH@Z"

ваще мне казалось , что можно как-то в исходниках cpp указать линкеру не манглить имя!

White Owl
Без def-файла такое переименование сделать невозможно.
Что за странная нелюбовь к def'ам?
просто мне кажется , что я что-то недопонял в опциях линкера или в командах препроцессора.. уже подхожу к тому, что def-файл -- единственная подходящая вещь
...
Рейтинг: 0 / 0
ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
    #33938784
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyно тогда зачем extern "C" ? без него просто манглы будут страшней:
Код: plaintext
Function ... Library "clib" Alias for "?GetImagefromCB@@YGHPADH@Z"

Потому что _GetImagefromCB@8 выводится элементарно из прототипа ф-и, а чтобы получить это "?GetImagefromCB@@YGHPADH@Z" надо смотреть в бинарнике что вышло.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / ПОМОГИТЕ запустить EXTERNAL FUNCTION int SetDir( const char * path );
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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