Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Возврат значения из DLL
Форум на CrossPlatform.RU > Разработка > С\С++
freestyler2
Microsoft Visual Studio 2010.

Есть DLL на C++. Формочка на VB.NET


DLL:
__declspec(dllexport) char RETURN()
{
char a='R';
return a;
}


форма:
Declare Auto Function RETURN Lib "RETURN.dll" () As Char

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Static L As Char
L = CreatePrinter()
Me.Label1.Text = L
End Sub



При нажатии на кнопку Button1 на Label1 выводится не "R", а иероглиф. Именно иероглиф. Не похож на "несоответствие кодировок", однако не исключаю такой возможности. Что выводится приложил рисунком.


Ай нид хелп! Улыбающийся

Спасибо!!
Алексей1153
в VB используется юникод , а ты возвращаешь char

DLL:
extern "C"  WINAPI  WCHAR  RETURN()
{
   return L'R';
}
freestyler2
Цитата(Алексей1153 @ 18.10.2011, 12:09) *

Вы просто гений! Спасибо! :) Сколько же я искал ответ)))



А не подскажете, как вернуть строку? В DLL строка, её нужно передать в VB.NET
Алексей1153
статическую строку можно так:

Цитата
extern "C" WINAPI WCHAR* RETURN()
{
return L"строка";
}


динамическую строку посложнее. Суть в том, что нужно узнать длину строки, затем выделить память и передать указатель на эту память для её заполнения. У меня вот так выходило:

extern "C"  WINAPI  void  GetMyString(WCHAR* buffer, LONG lettersCount_withZT)
{
  
   ...//заполняем буфер длиной максимум  lettersCount_withZT-1 ,

   //на всякий случай устанавливаем терминатор
   buffer[lettersCount_withZT-1]=0;
}


'получить строку
Dim leng As Long
Dim str1 As String

'тут упрощённо считаем, что строка - не длиннее 100 литер (не включая zt)
'но можно сделать функцию для получения длины строки
leng = 100

'резервируем память
str1 = String(leng, 0)

'о - это у меня был экземпляр COM+ объекта, но вызов функции аналогичный
Call o.GetMyString(str1, leng+1)



пример написан в блокноте - возможны опечатки
freestyler2
Цитата(Алексей1153 @ 18.10.2011, 21:04) *
статическую строку можно так:

extern "C" WINAPI WCHAR* RETURN()
{
return L"строка";
}


Спасибо! строка возвращается, но только 6 символов нормально, а остальные на китайском :(

Я передаю из VB строку "vasyapupkin", а возвращается только 6 символов типа "vasya*?"№;)".
Dim D As String
Dim sTestString1 As String
sTestString1 = "vasyapupkin"
D = RETURN(sTestString1)

Me.Label1.Text = D



в DLL обрабатываю входную строку так:
extern "C" WCHAR* RETURN(wchar_t COL[30])
{
wchar_t ret[30];

for(int i=0;i<30;i++)
ret[i]=COL[i];

return ret;
}


Что я делаю неправильно?
freestyler2
Цитата(Алексей1153 @ 18.10.2011, 21:04) *
статическую строку



Предыдущее сообщение отредактировать не удалось.

В общем нашел способ передать так:
extern "C"  LPCSTR RETURN(LPCSTR pszString)
{
        LPCSTR pszString2;
    pszString2=pszString;

    return pszString2;
}


использование LPCSTR возвращает нормально текст.


НО!
пытаюсь получить из другой функции значение pszString2 и вернуть его в форму и получаю иероглифы :(
extern "C"  LPCSTR RETURN2()
{
        LPCSTR STRING;
    STRING=pszString2;

    return STRING;          //вот этот return возвращает иероглифы
}


Почему он возвращает иероглифы мне не понятно. До этого же все нормально работает. Подскажите пожалуйста :)
Алексей1153
1) конечно же надо передавать тип WCHAR* , а не wchar_t [30]
2) в первой функции ты передаёшь указатель и этот же указатель возвращаешь. Всё нормально
3) как вернуть строку я выше описывал. Проканает ли другое с VB - я не знаю, я мало с VB общался
freestyler2
понятно.

Цитата(Алексей1153 @ 20.10.2011, 1:28) *
3) как вернуть строку я выше описывал. Проканает ли другое с VB - я не знаю, я мало с VB общался


Пробую таким образом. Иероглифы. Но я передаю переменную типа WCHAR*, не вот так L"ляляля". Я так понял ошибка в том, что я не применяю приведение с помощью L .

как его можно сделать для моей переменной X?


[code]
WCHAR* X;

extern "C" WCHAR* RETURNME()
{
return X;
}
[code]
Алексей1153
freestyler2, "L" - это не приведение, это префикс юникодной строки. Без L будет ascii строка. Компилятор просто не даст тебе использовать неправильное сочетание указателей (например char* и L"123")

Цитата
Пробую таким образом

не вижу, где ты пробуешь
freestyler2
Цитата(Алексей1153 @ 20.10.2011, 7:45) *
Цитата
Пробую таким образом

не вижу, где ты пробуешь


Вот так:

extern "C" WCHAR* RETURNME(WCHAR* XX)
{
WCHAR* X;
X=XX;
return X;
}


вот такой return выдает иероглифы. Я хочу использовать как-нибудь _T() или L для переменной X :)
Алексей1153
freestyler2, в своём примере я показывал не так совсем ) Попробуй, как у меня. У меня работало

макрос _T() смотрит на определение UNICUDE и в зависимости от определённости ставит префикс L или нет. Если пользуешься _T() , то тогда уж пользуйся TCHAR* по логике. Он тоже раскрывается в зависимости от UNICODE

но как показала практика, нафик эти универсальности. Пусть функция/класс будет либо только монобайтной, либо только юникодной (явно использовать char, WCHAR , L, а также постфиксы "A" и "W" функций WinAPI) . Если где-то и придётся выполнить сопряжения, это всегда возможно при помощи функций
MultiByteToWideChar http://msdn.microsoft.com/en-us/library/dd319072(VS.85).aspx
WideCharToMultiByte http://msdn.microsoft.com/en-us/library/dd...0(v=VS.85).aspx
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.