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

Вниз

Как получить из dll параметры   Найти похожие ветки 

 
Галинка   (2008-04-10 13:33) [0]

прототип имеет вид:

_declspec(dllexport) int gelLogInfo(char *, int *);

вызов имеет вид:

char name[25]="\0", chr;
int count;

gelLogInfo(name, &count);


значения остаются чистыми. Причем при компиляции с MinGW работает, а в студии нет?


 
KSergey ©   (2008-04-10 14:06) [1]

Подозреваю разные соглашения о вызовах.

К стати, что значит "не работает в студии"? И dll и exe в ней компилятся или только dll?


 
Галинка   (2008-04-10 14:47) [2]

и длл и приложение-акцептор компилятся в одной и той же среде. Первый раз в Eclipse+MinGW. Там все работает. Второй раз в Visual Studio. А тут не работает.

Соглашения взяты из примеров соответственно для cl+LINK и MinGW.


 
Галинка   (2008-04-10 14:48) [3]

При трассеровке значения в длл заполняются, но "наружу" не выдаются (( А может и выдабтся, только лежат по другому адресу ((


 
guav ©   (2008-04-10 14:51) [4]

а count точно чисто out ?
может он ещё и принимает размер буфера
int count = _countof(name);


 
Галинка   (2008-04-10 14:53) [5]

оно адреса меняет. Как этого избежать???


 
Галинка   (2008-04-10 14:55) [6]

count, это не длина массива. Эта переменная потом должна использоваться сама по себе.


 
clickmaker ©   (2008-04-10 15:09) [7]


> [5] Галинка   (10.04.08 14:53)
> оно адреса меняет. Как этого избежать???

код функции?


 
KSergey ©   (2008-04-10 15:12) [8]

> Галинка   (10.04.08 14:47) [2]
> и длл и приложение-акцептор компилятся в одной и той же
> среде. Первый раз в Eclipse+MinGW. Там все работает. Второй
> раз в Visual Studio. А тут не работает.

Это фантастика и так не бывает.
Есть подозрение, что компилится разный исходный код, только автор об этом не догадывается.


 
Галинка   (2008-04-10 15:15) [9]

int gelLogInfo(const char *lognampsw, int *repit_count){
   /* TODO: Replace with your own code */
char param[25]="\0", compl_name[25]="\0";
int linecount=1, res;
FILE *f;

f = fopen("login.txt", "r");

if (f == NULL) {
 printf("\nFile is not found...\n");
 return -1;
}

if(fscanf(f, "%s", param) > 0){
 strcat(compl_name, param);
 strcat(compl_name, " ");
}
printf("%s\n", param);

linecount++;
strcpy(param,"\0");
if (fscanf(f, "%s", param) > 0)
 strcat(compl_name, param);
lognampsw = &compl_name[0];
printf("%s\n", param);
printf("%s\n", compl_name);

linecount++;
if (fscanf(f, "%i", &res)>0)
 repit_count = &res;

fclose (f);

   return 0;
}
int WRLib::gelLogInfo(const char *lognampsw, int count, int *repit_count){
   /* TODO: Replace with your own code */
char param[25]="\0", compl_name[25]="\0";
int linecount=1, res;
FILE *f;

f = fopen("login.txt", "r");

if (f == NULL) {
 printf("\nFile is not found...\n");
 return -1;
}

if(fscanf(f, "%s", param) > 0){
 strcat(compl_name, param);
 strcat(compl_name, " ");
}
printf("%s\n", param);

linecount++;
strcpy(param,"\0");
if (fscanf(f, "%s", param) > 0)
 strcat(compl_name, param);
lognampsw = &compl_name[0];
printf("%s\n", param);
printf("%s\n", compl_name);

linecount++;
if (fscanf(f, "%i", &res)>0)
 repit_count = &res;

fclose (f);

   return 0;
}
int WRLib::gelLogInfo(const char *lognampsw, int count, int *repit_count){
   /* TODO: Replace with your own code */
char param[25]="\0", compl_name[25]="\0";
int linecount=1, res;
FILE *f;

f = fopen("login.txt", "r");

if (f == NULL) {
 printf("\nFile is not found...\n");
 return -1;
}

if(fscanf(f, "%s", param) > 0){
 strcat(compl_name, param);
 strcat(compl_name, " ");
}
printf("%s\n", param);

linecount++;
strcpy(param,"\0");
if (fscanf(f, "%s", param) > 0)
 strcat(compl_name, param);
lognampsw = &compl_name[0];
printf("%s\n", param);
printf("%s\n", compl_name);

linecount++;
if (fscanf(f, "%i", &res)>0)
 repit_count = &res;

fclose (f);

   return 0;
}


 
Галинка   (2008-04-10 15:16) [10]

KSergey ©   (10.04.08 15:12) [8]

конечно все может быть. Но копи-пасте пользовалась ))


 
Галинка   (2008-04-10 15:17) [11]

функция вставилаь три раза почему-то ((( Не у мею я наверное копи-пэйст правильно использовать ))


 
clickmaker ©   (2008-04-10 15:20) [12]


> lognampsw = &compl_name[0];

вот это что?

тогда уж strcpy(lognampsw, compl_name)


 
clickmaker ©   (2008-04-10 15:21) [13]

плюс
repit_count = &res; => *repit_count = res;

понятно вообще, что в этих строчках в твоем коде?


 
Галинка   (2008-04-10 15:33) [14]

спасибо за помощь. Вроде заработало )) С указателями как всегда кашка в головешке ((( Сделала так:

int gelLogInfo(char *lognampsw, int count, int *repit_count){
   /* TODO: Replace with your own code */
memset((void *)lognampsw, 0, count*sizeof(char));
char param[25]="\0";
int linecount=1, res;
FILE *f;

f = fopen("login.txt", "r");

if (f == NULL) {
 printf("\nFile is not found...\n");
 return -1;
}

if(fscanf(f, "%s", param) > 0){
 strcat(lognampsw, param);
 strcat(lognampsw, " ");
}
printf("%s\n", param);

linecount++;
strcpy(param,"\0");
if (fscanf(f, "%s", param) > 0)
 strcat(lognampsw, param);
//lognampsw = &compl_name[0];
printf("%s\n", param);
printf("%s\n", lognampsw);

linecount++;
if (fscanf(f, "%i", repit_count)<1)
 return -1;

fclose (f);

   return 0;
}


т.е. пишу сразу по переданным адресам. Это не опасно с точки зрения свяких ошибков?


 
clickmaker ©   (2008-04-10 15:36) [15]

опасно, если длина строки превысит выделенный буфер
я бы передавал размер буфера-приемника и юзал бы strncpy


 
Галинка   (2008-04-10 15:48) [16]

во-первых, размер буфера передаю. Это int count. В его пределах потом затирается строка в memset.

во-вторых, strcpy используется для обнуления промежуточного буфера. опасность может представлять strcat. Она просто дописывает в кронце? Или проверяет таки размер строки-приемника?


 
KSergey ©   (2008-04-10 15:52) [17]

> Галинка   (10.04.08 15:48) [16]
> во-первых, размер буфера передаю. Это int count.

> Галинка   (10.04.08 14:55) [6]
> count, это не длина массива.

"Как понимать тебя, Саид?"


 
evvcom ©   (2008-04-10 16:05) [18]

Сравни:
clickmaker ©   (10.04.08 15:36) [15] strncpy
Галинка   (10.04.08 15:48) [16] strcpy


 
Галинка   (2008-04-10 16:09) [19]


> KSergey ©   (10.04.08 15:52) [17]
>
> > Галинка   (10.04.08 15:48) [16]
> > во-первых, размер буфера передаю. Это int count.
>
> > Галинка   (10.04.08 14:55) [6]
> > count, это не длина массива.
>
> "Как понимать тебя, Саид?"
>


Так и понимать, что раскаялась в содеяном и исправила ошибки )) Во втором варианте есть int count (который размер массива) и int *repit_count (в который читаю нужный мне для использования параметр).


 
Галинка   (2008-04-10 16:11) [20]


> evvcom ©   (10.04.08 16:05) [18]
>
> Сравни:


сравнила. И что? strcpy в последнем варианте используется ТОЛЬКО чтобы обнулить промежуточную строку, там копируется ВСЕГДА один символ, а именно "\0". Ну чем там различно strcpy & strncpy?


 
clickmaker ©   (2008-04-10 16:14) [21]


> Ну чем там различно strcpy & strncpy?

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


 
Галинка   (2008-04-10 16:18) [22]

clickmaker ©   (10.04.08 16:14) [21]

к сожалению, строка-акцептор должна ВСЕГДА достаточна по длине (( Это может контролировать только программист, насколько я поняла. А strncat берет первые n символов из строки-донора.

А можно я тут спрошу, чтоб новую ветку не открывать? Кто-то знает, как из длл-ки, скомпилиной в MinGW, получить .lib-файл?


 
clickmaker ©   (2008-04-10 16:28) [23]


> к сожалению, строка-акцептор должна ВСЕГДА достаточна по
> длине

есть такой вариант
void SomeFunc(char** str)
{
 str = (char*)malloc(needed_size);
 ...
}

void FreeString(char* str)
{
 free(str);
}


 
Галинка   (2008-04-10 16:33) [24]

clickmaker ©   (10.04.08 16:28) [23]

при аллокировании новой памяти получим новый адрес. А потом я опять запутаюсь, как его вызывающей программе сообщить (( К тому же, строго говоря, needed_size заранее вообще неизвестен, т.к. чтение из файла идет. Пока файл валидный, все будет работать. Для тестовых целей должно хватить.

Вся эта затея с длл-кой, строго говоря, понадобилась, чтобы в WinRunner потестировать загрузку самописной биб-ки. Но тут свои проблеммки ((


 
Галинка   (2008-04-10 16:33) [25]

кстати, еще раз спасибо за помощь )))


 
clickmaker ©   (2008-04-10 16:39) [26]


> при аллокировании новой памяти получим новый адрес. А потом
> я опять запутаюсь, как его вызывающей программе сообщить
>

а какие проблемы? функция его сама выдает наружу. Главное - запомнить, а потом отдать для освобождения
В случае с чтением из файла можно либо сразу задать размер = размеру файла, либо приращивать на некую дельту по мере чтения (realloc)



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

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

Наверх




Память: 0.53 MB
Время: 0.025 c
15-1207253475
djaUser
2008-04-04 00:11
2008.05.25
Как правильно писать софт


2-1209670456
Jebiga
2008-05-01 23:34
2008.05.25
Как работать с GIF файлами?


2-1209892032
filin2323
2008-05-04 13:07
2008.05.25
скрытие формы


3-1197897575
Sergey13
2007-12-17 16:19
2008.05.25
План запроса в MySQL


15-1207730976
Виталий
2008-04-09 12:49
2008.05.25
Виртуальная машина Linux в домене