powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Параметр String в dll
20 сообщений из 20, страница 1 из 1
Параметр String в dll
    #32328261
В делфи создаю dll, в ней ф-ию

function DOZOpen(var Str: String):Boolean; StdCall;

Внутри ф-ии присваиваю Str строку.
При тесте написанном на делфи-же все работает.

В PB - нет.

Пишу так:

FUNCTION boolean DOZOpen( ref String Str) LIBRARY "DLL_Merav.dll"

Пробовал и без ref.
Помогите!
...
Рейтинг: 0 / 0
Параметр String в dll
    #32328414
Winnie-the-Pooh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор писал:В PB - нет. А подробнее можно? Падает? Теряет значение? Давно не брал в руки Делфи, но насколько помню, там есть что-то вроде типа cstr. Если есть - ваш случай. Если нет, то дело хуже - надо заставить Дельфю правильно преобразовать параметр. Поищите пример с callback функцией на Дельфи, сделайте как там.

В качестве тестовой среды сишный модуль и LoadLibrary лучше Дельфей, IMHO.
...
Рейтинг: 0 / 0
Параметр String в dll
    #32328427
function DOZOpen(Str: PChar):Boolean; StdCall;

FUNCTION boolean DOZOpen( String Str) LIBRARY "DLL_Merav.dll"
...
Рейтинг: 0 / 0
Параметр String в dll
    #32328435
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
...
Рейтинг: 0 / 0
Параметр String в dll
    #32329405
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор писал:
Код: plaintext
1.
FUNCTION boolean DOZOpen( ref String Str) LIBRARY  "DLL_Merav.dll"  

Падает или значение не присваивает?

А вызов этой функции как оформлен?
Если не присваивает значение, то надо бы так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
string ls_RetStr
ls_RetStr=space( 255 )
IF DOZOpen( ls_RetStr) then 
  MessageBox ( "Ok!" , ls_RetStr)
ELSE
  MessageBox ( "Error!" , ls_RetStr)
END IF
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Параметр String в dll
    #38369227
ЛыдЫ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
стало актуально, написал библиотеку на Delphi 7
вызываю функцию из dll на PowerBuilder 12.5
и вылетает РВ

Код: pascal
1.
2.
3.
4.
5.
function GetTEST(param: PChar): Integer; stdcall; export;
begin
   param := 'TEST_тест';
   Result := 159;
end;



Код: pascal
1.
function long GetTEST(ref string pResult) library "AvayaColler.dll"



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
string pResult
long ll_res

pResult = space(255)

pResult = 'тест_TEST'
messagebox('',pResult)
ll_res = GetTEST(pResult)



messagebox('',pResult)
messagebox('', string(ll_res))
[/SRC]

пишет:
---------------------------
System Error
---------------------------
Error Number 15.

Error text = Error calling external function GetTEST at line 29 in clicked event of object cb_2 of w_test..

Window/Menu/Object = w_test.

Error Object/Control = cb_2.

Script = clicked.

Line in Script = 29.
---------------------------
ОК
---------------------------

при том, что если функция принимает и возвращает числовой тип, такой проблемы нет. беда только со строками
...
Рейтинг: 0 / 0
Параметр String в dll
    #38369386
alexis glinski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю как PChar в Delphi 7, но string в PB12.5 - это
PB Helpstring of Unicode characters with variable length (0 to 1073741823)
...
Рейтинг: 0 / 0
Параметр String в dll
    #38369446
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛыдЫ ,
может как то так надо:
function long GetTEST(ref string pResult) library "AvayaColler.dll" Alias for "GetTEST;Ansi"
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370347
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16.08.2013 20:06, alexis glinski пишет:

> не знаю как PChar в Delphi 7

D7 - это ANSI. Unicode - это D2009+.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370397
ЛыдЫ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dim2000,

я уже голову сломал, что не так то ??

utest.pas
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
unit utest;

interface

function GetTest2(pString: PChar;
                             nLongInt: LongInt;
                             pResult: PChar;
                             var nLen: LongInt): Integer; stdcall; export;

implementation
uses
  SysUtils, Windows;


function GetTest2(pString: PChar;
                             nLongInt: LongInt;
                             pResult: PChar;
                             var nLen: LongInt): Integer; stdcall; export;
begin
    FillMemory(pResult, nLen, 0);
    FillMemory(pString, nLen, 0);
    pString := PChar(pString);
    pResult := PChar(pResult + ' | ' + ':Ðåçóëüòàò');
    nLongInt := nLongInt * 2;
    Result := 159;    
end;


end.



test.dpr
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
library test;

uses
  utest in 'utest.pas';

exports

  GetTest2       Name 'GetTest2';
{$R *.RES}

begin

end.



Global External Functions
Код: pascal
1.
function long GetTest2(string pString, long nLongInt, ref string pResult, ref long nLen ) library "test.dll" alias for "GetTest2;Ansi"




on form button clicked

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
long nLen
long nLongInt
string pString
string pResult

pString = space(1024)
pString = 'TEST'
nLongInt = 27
pResult = space(1024)
pResult = '!!тест!!'
nLen = 1024
						
				
GetTest2(pString, nLongInt, pResult, nLen)

messagebox('pString',pString)
messagebox('nLongInt',string(nLongInt))
messagebox('pResult',pResult)
messagebox('nLen',string(nLen))



ничерта не работает. вылетает ошибка, о том что параметры референс не верные.
плюс, при закрытии App запущенного из под среды - падает среда.
опробовано дополнительно и на PB 9.0.2 build 7610
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370399
ЛыдЫ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как-то странно копировался текст
Код: pascal
1.
    pResult := PChar(pResult + ' | ' + ':Результат');
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370513
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛыдЫ
Код: pascal
1.
2.
   FillMemory(pString, nLen, 0);
    pString := PChar(pString);



Что и зачем должны делать эти строки ?

ЛыдЫ
Код: pascal
1.
   nLongInt := nLongInt * 2;


Что и зачем должна делать эта строка ?


alexis glinskiне знаю как PChar в Delphi 7,

Чтобы не гадать на кофейной гуще надо использовать не ярлыки, а конкретные типы.
AnsiChar/PAnsiChar/AnsiString или WideChar/PWideChar/WideString(или с D2009 UnicodeString)


ЛыдЫ
Код: pascal
1.
2.
pResult = space(1024)
pResult = '!!тест!!'



Какого размера в итоге буфер под строку pResult ?


ЛыдЫ
Код: pascal
1.
function long GetTest2(string pString, long nLongInt, ref string pResult, ref long nLen )



Чем отличается по размещению в стеке передача параметров string / ref string ? int / ref int ?
почему в Delphi 1-й и 3-й парааметр описаны одинаково, а в PB по разному ?

ЛыдЫ
Код: pascal
1.
    FillMemory(pResult, nLen, 0);


ты вообще понимаешь, что ты ТУТ сделал ??? захреначил весь стек нулями!
куда делась крышка после имени переменной?
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370519
ЛыдЫ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чо? o_O
а Вы случайно не из Одессы?
можно ли больше конкретики?
что именно не так?
Ваши наводящие вопросы породили у меня больше вопросов.
я так и не понял что я "захреначил"
спасибо за ответ
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370538
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вaриант

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
function GetTest2(
  const pString: PAnsiChar;  const nLongInt: LongInt;
  const pResult: PAnsiChar;  var nLen: LongInt): Integer; stdcall; export;
var temp: AnsiString;
  procedure dump(name: AnsiString);
  begin
     name := name + ' == "' + temp +'"' + #13#10;
     OutputDebugStringA(PAnsiChar(name)); 
  end;
begin
  OutputDebugStringA('Entered Delphi function'#13#10);

  temp := IntToStr(nLen); dump('nLen');
  temp := IntToStr(nLongInt); dump('nLongInt');

  temp := IntToHex(Integer(pString),2); dump('Pointer to pString');
  temp := IntToHex(Integer(pResult),2); dump('Pointer to pResult');

  temp := Result; dump('Result');
    FillMemory(pResult^, nLen*SizeOf(pResult^), 0);
  temp := Result; dump('pResult');

  temp := pString; dump('pString');
    FillMemory(pString^, nLen*SizeOf(pString^), 0);
  temp := pString; dump('pString');

  temp := pResult;
  temp := temp + ' | ' + ':Ðåçóëüòàò';
  dump ('temp');

  StrLCopy(pResult, PAnsiChar(temp), nLen);

    nLongInt := nLongInt * 2;
    Result := 159;    
  OutputDebugStringA('Exiting Delphi function'#13#10);
end;

[/quote]

Запускаешь SysInternals DebugView и перехватываешь историю исполнения, что там у тебя в DLL творится
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370540
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛыдЫ,

а я откуда знаю что у тебя не так и что ты вообще хочещь добиться и что тьако\е ваш PB и как он вообще работает с процессором и стеком ?

Я тебе задал вопросы, на которые надо ответить, чтобы понять что у тебя происходит. Быдь добр, пожалуйста.
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370542
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛыдЫя так и не понял что я "захреначил"

Я кажется сказал что - стек.
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370569
ЛыдЫ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛыдЫ
Код: pascal
1.
2.
   FillMemory(pString, nLen, 0);
    pString := PChar(pString);




AriochЧто и зачем должны делать эти строки ?

согласен, тут лажанул.

ЛыдЫ
Код: pascal
1.
   nLongInt := nLongInt * 2;


AriochЧто и зачем должна делать эта строка ?

это для теста, передал один параметр - вернул другой



ЛыдЫ
Код: pascal
1.
2.
pResult = space(1024)
pResult = '!!тест!!'


AriochКакого размера в итоге буфер под строку pResult ?

1024 байта

ЛыдЫ
Код: pascal
1.
function long GetTest2(string pString, long nLongInt, ref string pResult, ref long nLen )


AriochЧем отличается по размещению в стеке передача параметров string / ref string ? int / ref int ?
почему в Delphi 1-й и 3-й парааметр описаны одинаково, а в PB по разному ?

почему же поразному?

function GetTest2(pString: PChar; nLongInt: LongInt; pResult: PChar; var nLen: LongInt): Integer; stdcall; export;
function long GetTest2(string pString, long nLongInt, ref string pResult, ref long nLen ) library "test.dll"


одинаково
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370592
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛыдЫ string pString
ЛыдЫ ref string pResult

Одинаково ? две коротких строки сравнить не можете ?
...
Рейтинг: 0 / 0
Параметр String в dll
    #38370594
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛыдЫ1024 байта

Ну-ну. В Дельфи он стал бы 8 символов, а не 1024 байта.
Но твоя программа - тебе и отвечать, знаешь ли ты внутреннюю механику PB
...
Рейтинг: 0 / 0
Параметр String в dll
    #38371255
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не то с типами данных. Попробуйте передавать и возвращать blob
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Параметр String в dll
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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