Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#1: 2010-09-18 04:39:05 ЛС | профиль | цитата
Почему этот код:

#pas
var
s1:string;
begin
s1:='Привет!';
SomeFunc(s1);
end;

Выдает ошибку: Error: Incompatible types: 'Integer' and 'String', в строке "SomeFunc(s1);"
где он тут увидел integer?

Полный код:

#pas
unit HiAsmUnit;

interface

uses kol,Share,Debug,MyDLL,windows;

type
THiAsmClass = class(TDebug)
private

public
on_SomeFunc:THI_Event;
procedure do_SomeFunc(var _Data:TData; Index:word);

end;

implementation

procedure THiAsmClass.do_SomeFunc;
var
s1:string;
begin
s1:='Привет!';
s1:= SomeFunc(s1);
_hi_onEvent(on_SomeFunc,s1)
end;

end.

карма: 0

0
Ответов: 5446
Рейтинг: 323
#2: 2010-09-18 04:47:57 ЛС | профиль | цитата
login, а где определена SomeFunc?
карма: 1

0
Ответов: 1429
Рейтинг: 50
#3: 2010-09-18 09:00:54 ЛС | профиль | цитата
В этой DLL библиотеке:


#pas
library MyDll;

uses Windows;

function SomeFunc(I: string): string; stdcall;
begin
Result := 'asd';
end;

exports
SomeFunc;

begin
end.
------------ Дoбавленo в 05.03:
С integer все работает, но как только меняю на string - умирает.
Я, всего лишь, пытаюсь понять как забрать из DLL строковую переменную, а не число.
------------ Дoбавленo в 08.53:
iarspider, извиняюсь, я забыл править файл pas, в папке с HiASM.
Теперь все компилируется, но, все-равно, не работает ни с типом string, ни с Char прога слетает.
------------ Дoбавленo в 09.00:
В инете часто попадается намек на то, что, якобы надо какую-то память выделять и передавать указатели, надеюсь это все не правда?
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#4: 2010-09-18 11:47:39 ЛС | профиль | цитата
login писал(а):
якобы надо какую-то память выделять и передавать указатели, надеюсь это все не правда?

к сожалению правда. Память, выделенная для string в одном модуле и уничтоженная в другом приводит к Run Time error. Нужно использовать типы PChar и самостоятельно выделять для него память через системные ф-ции
карма: 27
1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#5: 2010-09-19 00:40:00 ЛС | профиль | цитата
Вот я нашел пример импортирования строки из DLL:
code_20663.txt
Но HiAsm пишет что не знает таких понятий как StrPas и Caption, может надо ему что-то дописывать в uses?
------------ Дoбавленo в 00.40:
Коллеги, помогите мне перенести "строковыю переменную" из примитивной DLL в HiAsm, сам я всеравно не справлюсь с этим.
В инете нет ниодного примера, который бы заработал даже в Delphi 7, не говоря уже про адаптацию к HiASM.
Задача: пусть DLL-лка вернет на точку HiAsm слово "Привет!", дальше я смогу разобраться сам.
карма: 0

0
файлы: 1code_20663.txt [699B] [150]
Администрация
Ответов: 15295
Рейтинг: 1519
#6: 2010-09-19 02:11:28 ЛС | профиль | цитата
не самый удачный, но рабочий пример:

#pas
var buf:string;
...
function ReceiveString(p:pchar):PChar; stdcall; export;
begin
buf := 'Receive text: ' + p + #0;
Result := PChar(buf);
end;
при использовании вызывать обязательно так:

#pas
var s:string;
...
s := ReceiveString('some text');
// use s here
карма: 27
0
Ответов: 1429
Рейтинг: 50
#7: 2010-09-19 02:38:13 ЛС | профиль | цитата
Dilma, скажите, что из этого надо писать в файл .PAS для HiAsm?
А что в IC?

Я написал "первое" в PAS, а второе в IC. Но функция не заходит в DLL а просто возвращает обратно тоже, что я в нее бросаю.
PAS:


#pas
unit FirstLib;

interface

uses Kol,Share,Win,Windows,Debug,Messages;

function ReceiveString(p:pchar):PChar; stdcall; export;

implementation

var buf:string;

function ReceiveString(p:pchar):PChar; stdcall; export;
begin
buf := 'Receive text: ' + p + #0;
Result := PChar(buf);

end;
end.


В IC:



Add(MainForm,2953706,21,105)
{
}
Add(Button,8818931,168,119)
{
Left=125
Top=105
Data=Integer(5)
link(onClick,11718020:do_inputString,[])
}
Add(Label,1201926,287,119)
{
Left=200
Top=110
}
Add(InlineCode,11718020,224,119)
{
WorkPoints=#14:do_inputString|
EventPoints=#14:on_inputString|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,FirstLib,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|28: on_inputString:THI_Event;|57: procedure do_inputString(var _Data:TData; Index:word);|3: |5: end;|0:|14:implementation|0:|37:procedure THiAsmClass.do_inputString;|13:var s:string;|5:begin|33:s := ReceiveString('Мой текст!');|13:// use s here|29:_hi_onEvent(on_inputString,s)|4:end;|0:|4:end.|
link(on_inputString,1201926:doText,[])
}
карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#8: 2010-09-19 02:49:58 ЛС | профиль | цитата
login писал(а):
а просто возвращает обратно тоже, что я в нее бросаю.

с припиской "Receive text: ". А ожидалось еще что-то?
карма: 27
1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#9: 2010-09-19 02:53:00 ЛС | профиль | цитата
Вы взяли DLL из примера выше? вроде должно еще приписать "The string will be transferred to application:"
Извините, я наверное совсем ничего не понял.
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#10: 2010-09-19 02:58:19 ЛС | профиль | цитата
login, не понл, что ты вообще створил, но код Dilm-ы работает прекрасно

Код dll


library MyDll;

uses Windows;

var buf:string;

function ReceiveString(p:pchar):PChar; stdcall;
begin
buf := 'Receive text: ' + p + #0;
Result := PChar(buf);
end;

exports
ReceiveString;

begin
end.

Работа c dll

code_20664.txt

Естественно, что dll должна быть там же, где и проект
карма: 22

1
файлы: 1code_20664.txt [789B] [175]
Голосовали:login
Ответов: 1429
Рейтинг: 50
#11: 2010-09-19 06:16:58 ЛС | профиль | цитата
!!! Работает!!!
АА СпасибО!!
------------ Дoбавленo в 06.16:
DLL работает, генерит миди данные..
А как из DLL посылать события в HiAsm?
карма: 0

0
Разработчик
Ответов: 4698
Рейтинг: 426
#12: 2010-09-19 12:24:30 ЛС | профиль | цитата
login писал(а):
А как из DLL посылать события в HiAsm?

Когда то и я задавал такой же вопрос
Надо в IC создавать функцию, вызывающую определенное событие, а в DLL передавать указатель на эту функцию, например (без DLL, в IC):
code_20669.txt

карма: 10
1
файлы: 1code_20669.txt [1KB] [190]
Голосовали:login
Ответов: 5227
Рейтинг: 587
#13: 2010-09-19 17:24:02 ЛС | профиль | цитата
login писал(а):
С integer все работает, но как только меняю на string - умирает

с сишными библиотеками всегда такие грабли, PChar обычно без проблем.
Assasin, следует наверно уточнить что для этого нужно использовать dll в статике.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 1429
Рейтинг: 50
#14: 2010-09-20 08:20:19 ЛС | профиль | цитата
Assasin, извините, я долго сидел, и, пока, не смог понять как выделить из этого кода код DLL (это для меня, сложный код, я не могу его, доконца, понять)
А у Вас, случайно, нет примера, с уже выделенным кодом DLL?
карма: 0

0
Ответов: 3349
Рейтинг: 233
#15: 2010-09-20 13:16:28 ЛС | профиль | цитата
login, Вот

карма: 1

1
файлы: 1dll.rar [71.4KB] [117]
Голосовали:login
Сообщение
...
Прикрепленные файлы
(файлы не залиты)