Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.009 c
15-1207672576
TIF
2008-04-08 20:36
2008.05.25
Не могу подконнектиться к Mail.ru для отправки почты...


2-1209824858
Res
2008-05-03 18:27
2008.05.25
wm_quit


15-1207398011
Nic
2008-04-05 16:20
2008.05.25
Ваше мнение: Acer Asphyre


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


8-1180607479
First
2007-05-31 14:31
2008.05.25
Vidio Проигрыватель





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский