· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Прога на дельфях и dll на асме.

Посл.отвђт Сообщенiе


Дата: Окт 21, 2004 12:46:57

Я понимаю, конечно, что вопрос про дельфи здесь оффтопик, но в дельфийских формух мне не помугут, да wasm мне ближе.

Написал я библиотеку dll на асме, нужно мне ее импользовать в дельфийской проге. так не получается ничего. Мне нужно передать библиотечной функции строку и вернуть строку.
1. я не понимаю как передать указатель на строку, не знаю как вернуть строку в дельфи.
2. в результате, дельфийская прога выдает ошибку после выполнения функции dll.


ЗЫ не стоит использоват дельфи, если можно написать на асме!


Дата: Окт 21, 2004 12:56:18

Используй
StrPas(Func(PChar(Stroka))); // Возвращает строку в Пасквилевском формате

Да простит меня великий All


Дата: Окт 21, 2004 14:42:22

Нужно использовать указатели. За все версии Delphi не скажу, но седьмая выполняет преобразование AnsiString<->PChar на автомате. В общем, все просто.

Передача указателя на строку в функцию на асме: MyAsmFunction(PChar(MyString))
Чтение строки, указатель на которую возвращает асм-функция: MyString:=MyAsmFunction, где MyAsmFunction описана как возвращающая результат типа PChar.

Если важна длина строки (строки Delphi могут содержать в середине нулевые символы, в чем, собственно, их самая главная крутизна), то она хранится в виде DWORD непосредственно перед первым байтом строки.


Дата: Окт 21, 2004 15:40:34

Вот смотрите дельфийский код:
Function Mess(S: pointer):PChar; external 'mylasik.dll';
// MyString:String;
MyArray:='2+5='#0; //MyArray: array[0..32] of Char;
MyString := StrPas(Mess(@MyArray));

процедура в библиотеке:
Mess proc aaaa:dword
; mov eax,aaaa
invoke MessageBox,0,eax,eax,MB_OK
mov eax,offset mmmm ; mmmm db "test",0
ret
Mess endp

Получается в функции Mess регистр eax уже содержит указатель на сточку, а по адрессу аааа ее нет.
да и эта строчка MyString := StrPas(Mess(@MyArray));
вроде должна работать, а реале нет.


Дата: Окт 21, 2004 16:12:19

А с соглашениями о способе передачи параметров точно ничего не напутано?


Дата: Окт 21, 2004 16:40:54

stdcall забыл :)


Дата: Окт 21, 2004 16:45:56

Function Mess(S: pointer):PChar; stdcall external 'mylasik.dll';
Вроде так :)


Дата: Окт 22, 2004 02:27:18

function Mess(S: String): String; stdcall;
implementation
function Mess; external 'mylasik.dll' name 'Mess';


Дата: Окт 22, 2004 08:32:55

Во работает! большое человеческое шпасибо! сам бы долго мучался %)
Только не понял зачем нужен implementation


Дата: Окт 22, 2004 11:03:16 · Поправил: leo

maradon
"Только не понял зачем нужен implementation"
masquer привел пример, когда функция Мess объявлена в interface и может быть доступна для других модулей. Если этого не нужно, то просто объявляешь
implementation
function Mess(S:PChar):PChar;stdcall;external 'mylasik.dll' name 'Mess';

Единственное замечание к коду masquer - это использование string. Как известно, при работе с dll передавать AnsiString не рекомедуется или нужно это делать осторожно (использовать в uses ShareMem или следить за тем, чтобы последний экземпляр строки удалялся только в "родном" модуле). Иначе можно нарваться на EAccessViolation или EInvalidPointer, т.к. без ShareMem у приложения и dll разные хипы.

CyberManiac
"За все версии Delphi не скажу, но седьмая выполняет преобразование AnsiString<->PChar на автомате"
Прямое присваивание работает с Delphi 3, поэтому конечно StrPas - это анахронизм. И тип PChar совместим c array[0..X] of Char, поэтому если объявляешь Mess(S:PChar), то дальше просто
//MyString:String; 
//MyArray: array[0..31] of Char; {а здесь лучше 31, а не 32 - иначе min 3 байта - на ветер (на align)}
MyString := Mess(MyArray); 


Дата: Окт 23, 2004 02:59:00 · Поправил: masquer


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.041