Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Параметр String в dll / 20 сообщений из 20, страница 1 из 1
19.11.2003, 10:37
    #32328261
Параметр String в dll
В делфи создаю dll, в ней ф-ию

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

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

В PB - нет.

Пишу так:

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

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

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

FUNCTION boolean DOZOpen( String Str) LIBRARY "DLL_Merav.dll"
...
Рейтинг: 0 / 0
19.11.2003, 12:00
    #32328435
Параметр String в dll
{ 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
19.11.2003, 20:41
    #32329405
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
автор писал:
Код: 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
Период между сообщениями больше года.
16.08.2013, 17:21
    #38369227
ЛыдЫ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
стало актуально, написал библиотеку на 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
16.08.2013, 19:06
    #38369386
alexis glinski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
не знаю как PChar в Delphi 7, но string в PB12.5 - это
PB Helpstring of Unicode characters with variable length (0 to 1073741823)
...
Рейтинг: 0 / 0
16.08.2013, 20:24
    #38369446
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
ЛыдЫ ,
может как то так надо:
function long GetTEST(ref string pResult) library "AvayaColler.dll" Alias for "GetTEST;Ansi"
...
Рейтинг: 0 / 0
19.08.2013, 10:35
    #38370347
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
16.08.2013 20:06, alexis glinski пишет:

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

D7 - это ANSI. Unicode - это D2009+.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.08.2013, 11:12
    #38370397
ЛыдЫ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
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
19.08.2013, 11:13
    #38370399
ЛыдЫ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
как-то странно копировался текст
Код: pascal
1.
    pResult := PChar(pResult + ' | ' + ':Результат');
...
Рейтинг: 0 / 0
19.08.2013, 12:21
    #38370513
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
ЛыдЫ
Код: 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
19.08.2013, 12:24
    #38370519
ЛыдЫ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
чо? o_O
а Вы случайно не из Одессы?
можно ли больше конкретики?
что именно не так?
Ваши наводящие вопросы породили у меня больше вопросов.
я так и не понял что я "захреначил"
спасибо за ответ
...
Рейтинг: 0 / 0
19.08.2013, 12:33
    #38370538
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
Как в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
19.08.2013, 12:34
    #38370540
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
ЛыдЫ,

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

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

Я кажется сказал что - стек.
...
Рейтинг: 0 / 0
19.08.2013, 12:47
    #38370569
ЛыдЫ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
ЛыдЫ
Код: 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
19.08.2013, 12:58
    #38370592
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр String в dll
ЛыдЫ string pString
ЛыдЫ ref string pResult

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

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


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