Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.12;
Скачать: CL | DM;

Вниз

Помогите с передачей строкового аргумента   Найти похожие ветки 

 
RET ©   (2010-06-17 19:35) [0]

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


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

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


 
RET ©   (2010-06-17 20:05) [2]


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

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


 
RET ©   (2010-06-17 20:06) [3]

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


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

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


 
Servy ©   (2010-06-17 20:06) [5]

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";


 
Anatoly Podgoretsky ©   (2010-06-17 20:10) [6]


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

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


 
RET ©   (2010-06-17 20:36) [7]


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

**
конвенция вызова везде 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");//<-копируем юникод строку по заданному
                                        //адресу выделенной памяти
}


 
Плохиш ©   (2010-06-17 20:44) [8]


> Word: PWideChar;
>

Убил бы уже только за использование зарезервированного слова.

>  MessageBoxW(0,Word,0,0); //!!!!<-здесь какого-то лешего
> исключение если
>

Что-то я не помню таких исключений "Исключение"


 
RET ©   (2010-06-17 20:47) [9]

0012FDD0   00000041  |Text = 00000041 ???
Вот что в ольке, отладчике в стеке вместо слова, если у меня сделать wcscpy(Word,L"A");
ADD:

> Что-то я не помню таких исключений "Исключение"

прочитайте про эксцепшены на васме у клерка и у меня


 
RET ©   (2010-06-17 20:49) [10]

00000041 - это ASCII код Буквы "A" передается MessageBox"у вместо адреса, почему?


 
RET ©   (2010-06-17 20:53) [11]

Удалено модератором


 
RET ©   (2010-06-17 20:53) [12]

Удалено модератором


 
Сергей М. ©   (2010-06-17 21:08) [13]

Удалено модератором


 
Игорь Шевченко ©   (2010-06-17 21:16) [14]

Удалено модератором


 
RET ©   (2010-06-17 21:19) [15]

Удалено модератором


 
RET ©   (2010-06-17 21:19) [16]

Удалено модератором


 
RET ©   (2010-06-17 21:21) [17]

Удалено модератором


 
Сергей М. ©   (2010-06-17 21:22) [18]

Удалено модератором


 
RET ©   (2010-06-17 21:28) [19]

Удалено модератором


 
Сергей М. ©   (2010-06-17 21:30) [20]

Удалено модератором


 
RET ©   (2010-06-17 21:33) [21]

Удалено модератором


 
turbouser ©   (2010-06-17 21:36) [22]

Какая прелесть :)


 
Демо ©   (2010-06-17 21:41) [23]


> turbouser ©   (17.06.10 21:36) [22]
> Какая прелесть :)


Вот и поговорили.


 
Jeer ©   (2010-06-17 22:40) [24]

Ого !


 
Плохиш ©   (2010-06-17 22:51) [25]

Хорошая охота...


 
Anatoly Podgoretsky ©   (2010-06-17 23:46) [26]

Да какая охота, это больше на отстрел похоже.


 
Германн ©   (2010-06-18 01:43) [27]


> turbouser ©   (17.06.10 21:36) [22]
>
> Какая прелесть :)
>

А я прозевал. Весь день был в отлучке от компа :(
Может кто скинет на почту в анкете?



Страницы: 1 вся ветка

Текущий архив: 2010.09.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
15-1276689705
AKE
2010-06-16 16:01
2010.09.12
Есть ли аналог TBitmap в Visual c++?


2-1276534233
akosh12345
2010-06-14 20:50
2010.09.12
Вывод кнопок динамически


2-1276721389
GanibalLector
2010-06-17 00:49
2010.09.12
TClientSocket в DLL


2-1276392661
DROWSY
2010-06-13 05:31
2010.09.12
Если TIBDataSet - набор из нескольких связанных таблиц...


15-1276585131
brother
2010-06-15 10:58
2010.09.12
Любителям zx-spectrumа: видео...