Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с передачей строкового аргумента [D7, XP, 2003]


Страницы:   1 2

RET ©   (2010-06-17 19:35:00) 

Здравствуйте, я системный программист, но кроме Си и Асма практически не знаю. Есть такая проблема:
На Си: void _stdcall LALALA(WCHAR* word)
когда Делфи вызывает эту функцию, по-идее нужно мне от нее в Си передать указатель на UNICODE-строку (в параметр "word" с заранее выделенной еще в Делфи памятью оговоренного размера) , я должен передать туда (в параметр "word") слово в юникоде, но почемуто ничего не выходит или потом приходит вместо слова какой-либой "мусор". Вопрос: как должно выглядеть объявление моей функции в Делфи?
Заранее Спасибо.
ЗЫ: смотрел в Ольке в стек - юникод строка передается, но после вызова код уходит в дебри Делфийского ООП и в итоге MessageBoxW,например выдает мусорный буфер. Решение-то простое видимо, но понять про типы данных в Делфи мне сложновато.


RET   (2010-06-17 20:36:00) [21]


> Что то не видать твоего кода, а ведь ошибка в нем

**
конвенция вызова везде stdcall
****************************************
Это Делфи: - в нем я то и не уверен
***************************************
procedure TForm1.Timer1Timer(Sender: TObject);
var
Word: PWideChar;
begin
 Word:=PWideChar(LocalAlloc(LMEM_ZEROINIT,100));//<-память выделяем
 GetWord(Word); //<-эта из моей Си-шной вызывается
 MessageBoxW(0,Word,0,0); //!!!!<-здесь какого-то лешего исключение если
 // убрать все нормально без исключений (пробовал вместо месаджабокса  
 // другие юникод-API) не понимаю как делфи с указателями работает, как
 //  хочет что-ли?
 LocalFree(Cardinal(@Word));//<-освобождаем память
end;
end.
***********************
Это простейший Си:
void __stdcall GetWord(wchar_t* Word)
{
wcscpy(Word,L"Test-String");//<-копируем юникод строку по заданному
                                        //адресу выделенной памяти
}


Anatoly Podgoretsky   (2010-06-17 20:10:00) [22]


> что-то не помогает...

Что то не видать твоего кода, а ведь ошибка в нем.


Servy   (2010-06-17 20:06:00) [23]

procedure Test(S: PWideChar); stdcall;
begin
 MessageBoxW(0, S, 'Test', MB_OK);
end;

procedure CallTest;
var
 S: WideString;
begin
 S := 'blablabla';
 Test(PWideChar(S));
end;



В вашем примере случае функция Test будет реализована в, видимо, сишной dll, и объявлена вот так:

procedure Test(S: PWideChar); stdcall; external 'MyDllName.dll';


Правильный$Вася   (2010-06-17 20:06:00) [24]

так и говорит "не помогаю"?


RET   (2010-06-17 20:06:00) [25]

тк уже пробовал


RET   (2010-06-17 20:05:00) [26]


> PWideChar( твоя строка )

что-то не помогает...


Правильный$Вася   (2010-06-17 20:02:00) [27]

PWideChar( твоя строка )


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо