powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / входящие параметры
13 сообщений из 13, страница 1 из 1
входящие параметры
    #38372105
рядом есть похожий топик, но проблема не в том.
я сделал на делфе библиотеку

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
library mydll;
 {$WARN UNSAFE_CODE OFF}
 {$WARN UNSAFE_TYPE OFF}

uses SysUtils, Windows, Forms, Classes, Dialogs;

function myfunc(param : PChar) : Integer;stdcall;
begin
    showmessage(param);
    Result := 1;
end;

exports myfunc;

{$R *.res}

begin
end.



и вызываю ее в PowerBuilder

Код: pascal
1.
2.
3.
4.
5.
6.
function int myfunc(string param) library "mydll.dll"
=============
string param
param = 'TEST'
li_res = myfunc(param)
GarbageCollect()




только вот в
showmessage(param);
я получаю первый и единственный символ передаваемого слова.

как сделать так, чтобы слово передавалось и получалось в библиотеке полностью?
как и сосед, использую дельфи 7 и РВ 12.1

критика не принимается, только показательный пример рабочего фрагмента
...
Рейтинг: 0 / 0
входящие параметры
    #38372161
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПостороннимВВ,

PB 12 юникодный ?

А дельфи неюникодная ?

1) избавляйся в Delphi от типов char, pchar, string

2) ставь вметсо них чётко-определённые типы

2.1) не-юникодные: AnsiChar, PAnsiChar, AnsiString
2.2) юникодные: WideChat, PWideChar, WideString

В твоём случае надо писать что-то вроде

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function myfunc(const param : PWideChar) : Integer; stdcall;
var
   ws: WideString;
   as: AnsiString;
begin
   ws := Param; // переобразуем тип к родному для Delphi
   as  := AnsiString(ws); // схлопываем юникод в windows-1251
   showmessage(as);
   Result := 1;
end;
...
Рейтинг: 0 / 0
входящие параметры
    #38372162
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

так... "as" не пройдёт, это ключевое слово...
Ну переименуй во что-нибудь другое, не важно.
...
Рейтинг: 0 / 0
входящие параметры
    #38372163
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы попробовал передавать как ref string param
со всеми сопутствующими и вытекающими
ну и, принимать и обрабатывать, соответственно....
...
Рейтинг: 0 / 0
входящие параметры
    #38372181
пробовал
AnsiString
PAnsiString
PAnsiChar
все тщетно
еще наткнулся на вот такую статью
там есть пример, работающего клиента с библиотекой.
эту же библиотеку прикрутил к РВ и все те же страсти.
...
Рейтинг: 0 / 0
входящие параметры
    #38372191
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПостороннимВВпробовал
AnsiString
PAnsiString
PAnsiChar

а зачем?

1) я выше пример написал - там какой тип?

2) PB у тебя юникодный или до-юникодный ?
3) а типы ?Ansi*** юникодные или неюникодные ?

2 и 3 долны совпадать. Если несовпадают - получишь глюки, от безобидных и до разрушения стека.
...
Рейтинг: 0 / 0
входящие параметры
    #38372194
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще... нельзя работать с DLL людям, не писавшим ничего на ассемблере. Иначе вот так и получается...
...
Рейтинг: 0 / 0
входящие параметры
    #38372237
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[offtop]
Arioch... нельзя работать с DLL людям, не писавшим ничего на ассемблере...ага. на листочке карандашиком. и не отлаживавшим с листочка мысленно

[/offtop]
...
Рейтинг: 0 / 0
входящие параметры
    #38372317
все получилось через PWideChar
...
Рейтинг: 0 / 0
входящие параметры
    #38372360
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ikar,

понимаешь ли...

DLL означает, что ты говоришь своему компилятору: "я лучше тебя знаю, как какие переменные располагаются в памяти, как они передаются между процедурами и фукциями, и вообще не лезь в это дело, я сделаю сам, а будет какая ошибка - сам разберусь".

Без представления о том, как работает процессор, это довольно трудно сделать.
А это представление, не поигравшись с ассемблером хотя бы месяца три, тоже получить не получиться, будет только самообман.

А потом человек вообще не может прочитать документацию как писать и использовать DLL и зачем все эти наугажд поставленные stdcall, ref и ansi...
Ну а ловить и исправлять ошибки наугад можно долго.

Так что это не экстремизм, это практическое наблюдение.
...
Рейтинг: 0 / 0
входящие параметры
    #38372542
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ikar[offtop]
Arioch... нельзя работать с DLL людям, не писавшим ничего на ассемблере...ага. на листочке карандашиком. и не отлаживавшим с листочка мысленно

[/offtop]
...и не отжавшись перед этим +100500 раз, и не отслужив в армии :-)))))
...
Рейтинг: 0 / 0
входящие параметры
    #38372587
2Arioch
спасибо за ваши практические наблюдения, я на форум пришел не за нравственностью, а за ценным опытом - именно вашим опытом
благодарю
...
Рейтинг: 0 / 0
входящие параметры
    #38372676
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПостороннимВВпробовал
AnsiString
PAnsiString
PAnsiChar
все тщетно
еще наткнулся на вот такую статью
там есть пример, работающего клиента с библиотекой.
эту же библиотеку прикрутил к РВ и все те же страсти.
ну если кровь из носа нужно ANSI, то можно попробовать
Код: sql
1.
function int myfunc(ref blob param) library "mydll.dll" alias for "myfunc;ansi"



Код: sql
1.
2.
3.
4.
5.
string ls_param
blob{1024} lblb_Param
ls_param = 'TEST'
lblb_Param = Blob ( ls_param, EncodingANSI! )
li_res = myfunc(lblb_param)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / входящие параметры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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