Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
15-1276600467
Правильный$Вася
2010-06-15 15:14
2010.09.12
странный образ диска


6-1226147951
Рем
2008-11-08 15:39
2010.09.12
Шлюз (покси) для разных рабочих групп ?


15-1269882677
Piter
2010-03-29 21:11
2010.09.12
Установка windows на ноутбук без мышки


2-1276375219
AKE
2010-06-13 00:40
2010.09.12
Как получить координаты всех точек?


15-1276679561
vajo
2010-06-16 13:12
2010.09.12
диски для raid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский