Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

разработка DLL

470
25 мая 2003 года
MemWithoutName
16 / / 20.12.1999
Здравствуйте! У меня такая байда. Надо в ДЛЛ всунуть функцию, которая переводит число из 10-ной системы в 16-ную (Inttohex не использовать!) и результат вернуть в виде строки , ну сделал функцию, все она делает, и возвращает указатель: char*. Но при вызове в проге, происходит недопустимая операция.
Помогите как и функции в ДЛЛ правильно вернуть строку! Хелп!!!
Вот код:

extern "C" __declspec(dllexport) char* To16(int a)
{

float cel,ost;
char str[10],*temp,temp2[10];
do
{
ost=fmod(a,16);

cel=(a-ost)/16;
//cout<<cel<<endl;


if (ost==10) temp="A";
else
if (ost==11) temp="B";
else
if (ost==12) temp="C";
else
if (ost==13) temp="D";
else
if (ost==14) temp="E";
else
if (ost==15) temp="F";
else
//temp.Format("%d",ost);
itoa(ost,temp,10);
strcpy(temp2,temp);
//temp2=temp;
strcat(temp2,str);
//temp2+=str;
strcpy(str,temp2);
//str=temp2;
a=cel;
}
while(cel!=0);
//printf("%s",str);
return 10;
}



BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}


и код вызывающей программы:

typedef int (*CTo16)(int);
CTo16 To16;

HINSTANCE hMyDll;
hMyDll=LoadLibrary("1.dll");
To16 =(CTo16)::GetProcAddress(hMyDll,"To16");

char *t;

if (To16)
{
t=(*To16)(245;

}
3
25 мая 2003 года
Green
4.8K / / 20.01.2000
М-да... Закрутил...

Во-первых, ты уверен, что нужно возвращать char* ? Возникает проблема: как выделять область памяти, в которой размещается результат, и указатель на которую возвращается из процедуры. Есть два варианта (и оба проблематичные): [] и new. При первом варианте нужно четко представлять время жизни полученного результата, а во втором - кто должен будет освобождать память (delete). Первый способ предпочтительнее, но тебе сразу (т.е. в этой же строке) надо копировать результат:
strcpy(buf, To16(i));
В этом случае правильнее будет возвращать const char*, а не просто char*.
Т.о. не проще ли использовать std::string ?

#include <string>

extern "C" __declspec(dllexport)
std::string To16(int a)
{
char str[8];
sprintf(str, "0x%.4X", a);
return str;
}

Можно ещё использовать std::strstream.
362
26 мая 2003 года
_kolyan
339 / / 03.12.2002
Действительно мудрено ты придумал, MemWithoutName ;-)

Можно использовать правило, по которому работают все виндовые функции возвращающие строки, согласно которому - если функция должна вернуть строку, укажи ей буфер, в которыйц гужно положить значение

т.о. можно написать как у Green, но с небольшой вариацией

extern "C" __declspec(dllexport)
char* To16(int a, char *buf)
{
sprintf(buf, "0x%.4X", a);
return buf;
}

либо вообще не возвращать значение
470
29 мая 2003 года
MemWithoutName
16 / / 20.12.1999
Цитата:
Originally posted by _kolyan
Действительно мудрено ты придумал, MemWithoutName ;-)

Можно использовать правило, по которому работают все виндовые функции возвращающие строки, согласно которому - если функция должна вернуть строку, укажи ей буфер, в которыйц гужно положить значение

т.о. можно написать как у Green, но с небольшой вариацией

extern "C" __declspec(dllexport)
char* To16(int a, char *buf)
{
sprintf(buf, "0x%.4X", a);
return buf;
}

либо вообще не возвращать значение




А как в проге, которая вызывает функцию из ДЛЛ по указателю вывести на экран строку, переданную функцией из ДЛЛ?
А то я делал так и у меня не получилось:

char *t=new char[8];
cout<<*t;
и у меня всегда выводится Н!
Помогите плиз!

3
12 июня 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by MemWithoutName



А как в проге, которая вызывает функцию из ДЛЛ по указателю вывести на экран строку, переданную функцией из ДЛЛ?
А то я делал так и у меня не получилось:

char *t=new char[8];
cout<<*t;
и у меня всегда выводится Н!
Помогите плиз!



Советую разобраться с указателями!

char *t = new char[8];
...............
cout << t;
...............
delete t;

И не забывай про завершающий ноль:
t[7] = '\0';

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог