разработка DLL
Помогите как и функции в ДЛЛ правильно вернуть строку! Хелп!!!
Вот код:
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;
}
Во-первых, ты уверен, что нужно возвращать 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.
Можно использовать правило, по которому работают все виндовые функции возвращающие строки, согласно которому - если функция должна вернуть строку, укажи ей буфер, в которыйц гужно положить значение
т.о. можно написать как у Green, но с небольшой вариацией
extern "C" __declspec(dllexport)
char* To16(int a, char *buf)
{
sprintf(buf, "0x%.4X", a);
return buf;
}
либо вообще не возвращать значение
Цитата:
Originally posted by _kolyan
Действительно мудрено ты придумал, MemWithoutName ;-)
Можно использовать правило, по которому работают все виндовые функции возвращающие строки, согласно которому - если функция должна вернуть строку, укажи ей буфер, в которыйц гужно положить значение
т.о. можно написать как у Green, но с небольшой вариацией
extern "C" __declspec(dllexport)
char* To16(int a, char *buf)
{
sprintf(buf, "0x%.4X", a);
return buf;
}
либо вообще не возвращать значение
Действительно мудрено ты придумал, 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;
и у меня всегда выводится Н!
Помогите плиз!
Цитата:
Originally posted by MemWithoutName
А как в проге, которая вызывает функцию из ДЛЛ по указателю вывести на экран строку, переданную функцией из ДЛЛ?
А то я делал так и у меня не получилось:
char *t=new char[8];
cout<<*t;
и у меня всегда выводится Н!
Помогите плиз!
А как в проге, которая вызывает функцию из ДЛЛ по указателю вывести на экран строку, переданную функцией из ДЛЛ?
А то я делал так и у меня не получилось:
char *t=new char[8];
cout<<*t;
и у меня всегда выводится Н!
Помогите плиз!
Советую разобраться с указателями!
char *t = new char[8];
...............
cout << t;
...............
delete t;
И не забывай про завершающий ноль:
t[7] = '\0';