Форум: "Прочее";
Текущий архив: 2008.05.25;
Скачать: [xml.tar.bz2];
Вниз
Как получить из 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.008 c