![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с передачей строкового аргумента [D7, XP, 2003]
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( твоя строка )