Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Помогите с передачей параметров   Найти похожие ветки 

 
123_v   (2004-04-16 18:19) [0]

Господа, такая проблема:
В своей проге использую ф-цию из своей dll написанной на VC++6. Експортируемая ф-ция в Длл описана так:

int MyFunc(str* char)

а также соответствующая запись в *.def файле.

К своей проге я подключаю ее так:

TMyFunc = function(str: PChar): Integer; stdcall;
var
    MyFunc: TMyFunc;


ну и использую так:
begin
   dll:=LoadLibrary(PChar("mydll.dll"));
   @MyFunc:=GetProcAddress(dll,"MyFunc");
   if @MyFunc<>nil then
        MyFunc(PChar(SomeString+"other string"));
end.


Вот, и в момент вызова моей ф-ции происходит ошибка периода выполнения и кирдык. Что я зделал не так?

Заранее очень благодарен!


 
WebErr ©   (2004-04-16 18:24) [1]


> int MyFunc(str* char)

Мдя! Наверное всё-таки int MyFunc(char *str); I>:))))


 
Fred Perry   (2004-04-16 18:25) [2]

Боюсь ошибиться, но помоему проверка @MyFunc <> nil при любом раскладе вернет True, ибо это адрес статической переменной, который не может быть nil, ИМХО... Следовательно, ошибка где-то в первых двух строках, или в самой dll...


 
Skier ©   (2004-04-16 18:25) [3]

а не так случаем (Си всё-таки :) )
TMyFunc = function(str: PChar): Integer; cdecl;


 
WebErr ©   (2004-04-16 18:25) [4]


> @MyFunc:=GetProcAddress(dll,"MyFunc");

Здесь просто MyFunc:=GetProcAddress(dll,"MyFunc"); :))))


 
Германн ©   (2004-04-16 18:27) [5]

Может не stdcall, а cdecl?


 
123_v   (2004-04-16 18:27) [6]

Ну, т.е да, это я опечатался.....:)


 
WebErr ©   (2004-04-16 18:28) [7]


> if @MyFunc<>nil then
>         MyFunc(PChar(SomeString+"other string"));

Точно так же

if MyFunc <> nil then // Assigned(MyFunc)
 MyFunc(PChar(SomeString+"other string"));

Правильной дорогой идёшь, товарищ - надо, надо знать оба этих языка!!! :))))


 
WebErr ©   (2004-04-16 18:29) [8]

Будешь вторым Weber"ом (боже упаси!) :))))


 
123_v   (2004-04-16 18:30) [9]


> 123_v   (16.04.04 18:27) [6]
> Ну, т.е да, это я опечатался.....:)

Это я насчет порядка тип/имя переменной


 
WebErr ©   (2004-04-16 18:31) [10]

MyFunc в паскале - это указатель на функцию, как
typedef int (*TMyFunc)(str* char)
в С/С++ :))))


 
123_v   (2004-04-16 18:35) [11]

Нет, cdecl не помог. Есть еще варианты?


 
123_v   (2004-04-16 18:37) [12]


> WebErr ©   (16.04.04 18:31) [10]
> MyFunc в паскале - это указатель на функцию, как
> typedef int (*TMyFunc)(str* char)
> в С/С++ :))))

И что с ним делать?


 
Fred Perry   (2004-04-16 18:38) [13]

А ты не пробовал такое замечательно средство как анализ возвращаемых значений + GetLastError?


 
123_v   (2004-04-16 18:40) [14]

Кем возвращаимых? У меня после ошибки сразу аварийно завершается процедура и программа вслед за ней...


 
WebErr ©   (2004-04-16 18:44) [15]


TMyFunc = function(str: PChar): Integer; cdecl;
var
   MyFunc: TMyFunc;
...
begin
  dll:=LoadLibrary(PChar("mydll.dll"));
  MyFunc:=GetProcAddress(dll,"MyFunc");
  if Assigned(MyFunc) then
      MyFunc(PChar(SomeString+"other string"));
end.


 
Fred Perry   (2004-04-16 18:45) [16]

Ну например LoadLibrary в случае ошибки вернет NULL (в Delphi это скорее всего 0). Вот после LoadLibrary проверь, а не равна ли у тебя переменная dll нулю. Если равна, то функция GetLastError вернет тебе код ошибки, по которой можно более объективно субить о твоей проблеме...


 
WebErr ©   (2004-04-16 18:46) [17]


> 123_v   (16.04.04 18:40) [14]

GetLastError + F1
Но это тебе пока не понадобится!
Слишком всё примитивно!


 
123_v   (2004-04-16 18:48) [18]

Тоже самое. Вот что он пишет:
Exception EAccessViolatation in module ntdll.dll at 000021E1.
Access violatation at address 77F821E1 in module ntdll.dll. Read of address 00000034.


 
123_v   (2004-04-16 18:49) [19]

А dll не равно 0


 
WebErr ©   (2004-04-16 18:50) [20]


> Fred Perry   (16.04.04 18:45) [16]

И где тут GetLastError нАдА?
Пара if"ов + пошаговое выполнение и всё станет ясно!


 
VMcL ©   (2004-04-16 18:51) [21]

>123_v

MyFunc, случаем, не изменяет str?


 
WebErr ©   (2004-04-16 18:52) [22]

Что у тебя там в функции - давай сюда!!! :))))


 
123_v   (2004-04-16 18:52) [23]

Вот, я и выполняю пошагово, а толку? :)
> И где тут GetLastError нАдА?
> Пара if"ов + пошаговое выполнение и всё станет ясно!


 
WebErr ©   (2004-04-16 18:52) [24]

Только я через 4 минуты ухожу! ...


 
Fred Perry   (2004-04-16 18:54) [25]

Раз переменная dll не равна 0, значит у тебя сама функция в dll MyFunc что-то не так делает. Покажи ее код.


 
123_v   (2004-04-16 18:55) [26]

Ф-ция для распаковки UUE.
int decode (char *argv)
 FILE *infile = NULL;
 FILE *outfile = NULL;
 char linebuf [LINE_BUF_SIZE];
 char *linep = NULL;
 char *tempcp = NULL;
 int   linelen = 0;
 int   linecnt = 0;
 BYTE outbyte [3];
 infile = fopen (argv, "rt");
 outfile = fopen ("c:\\out", "wb");
 do
 {
   if (fgets (linebuf, LINE_BUF_SIZE, infile) == NULL)
   {
//      MessageBox(NULL, "Read error", "", 0);
   }

   linelen = DECODE_BYTE (linebuf [0]);
   linep = linebuf + 1;
   for (linecnt = linelen; linecnt > 0; linecnt -= 3, linep += 4)
   {
     if ((linep [0] == "\0") || (linep [1] == "\0") ||
         (linep [2] == "\0") || (linep [3] == "\0"))
     {
//       MessageBox(NULL, "uudecode: Error in encoded block", "", 0);
     }
     outbyte [0] = DECODE_BYTE (linep [0]);
     outbyte [1] = DECODE_BYTE (linep [1]);
     outbyte [0] <<= 2;
     outbyte [0] |= (outbyte [1] >> 4) & 0x03;
     outbyte [1] <<= 4;
     outbyte [2] = DECODE_BYTE (linep [2]);
     outbyte [1] |= (outbyte [2] >> 2) & 0x0F;
     outbyte [2] <<= 6;
     outbyte [2] |= DECODE_BYTE (linep [3]) & 0x3F;

     if (linecnt > 3)
     {
       if (fwrite (outbyte, 1, 3, outfile) != 3)
       {
//         MessageBox(NULL, "uudecode: Error writing to output file", "", 0);
       }
     }
     else
     {
      if (fwrite (outbyte, 1, linecnt, outfile) != linecnt)
       {
//         MessageBox(NULL, "uudecode: Error writing to output file", "" ,0);
       }
       linecnt = 3;
     }
   }
 } while (linelen != 0);
 fclose (infile);
 fclose (outfile);
 return 0;
}


 
123_v   (2004-04-16 18:59) [27]

???


 
VMcL ©   (2004-04-16 18:59) [28]

>>123_v

Отладь сначала функцию в DLL, потом уже используй её.


 
123_v   (2004-04-16 19:00) [29]

Она рабочает, я ее использую из Сишной проги и там все в порядке.


 
VMcL ©   (2004-04-16 19:02) [30]

>>123_v  (16.04.04 19:00) [29]

Тогда в Delphi: breakpoint на вызове функции, при останове - Debug Windows | CPU и F7, F7, F7...


 
Fred Perry   (2004-04-16 19:04) [31]

А ты уверен что эта функция рабочая? Так навкидку могу предположить следующее: насколько я помню Си, главный цикл чтения файла должен выглядеть не как

do
{
//...
} while (linelen != 0);


а

while(!foef(infile))
{
//...
}</CODE

...вот попробуй для начала это


 
123_v   (2004-04-16 19:08) [32]

Т.е. только так и больше никак?


 
VMcL ©   (2004-04-16 19:11) [33]

>>123_v  (16.04.04 19:08) [32]

А ты предлагаешь поиграть в угадалки? Раз ты уверен, что сама функция в DLL работает корректно, [21] не выполняется и соглашения о вызовах одинаковы (например, и в EXE и в DLL - stdcall)...


 
Fred Perry   (2004-04-16 19:13) [34]

> Т.е. только так и больше никак?

Если этот вопрос адресован мне, то ответ НЕТ, можно по всякому, но лично я обычно делаю так.

И еще одно: а ты уверен что файл с данными верный? Насколько я могу оценить визуально алгоритм достаточно чувствителен к непрвильным входным данным. Например при проверке linep[2], linep[3] можно уйти за пределы LINE_BUF_SIZE, что по сути и будет являтся причиной Access Violation...


 
123_v   (2004-04-16 19:13) [35]

Понятно, ладно всем спасибо


 
123_v   (2004-04-16 19:14) [36]

Хорошо, проверю.


 
Fred Perry   (2004-04-16 19:15) [37]

А может, чтобы Сишная функция понимался Дельфёй, ее надо тоже с какой-нить директивой объявлять? Там было чо-то типа PASCAL (для примера), т.е.

int PASCAL decode(char *argv)



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

Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.038 c
3-1081144448
dik
2004-04-05 09:54
2004.05.02
InterBase


9-1068140303
|dRake|
2003-11-06 20:38
2004.05.02
PowerFont :)


3-1080953066
olhovik
2004-04-03 04:44
2004.05.02
База данных


8-1074610714
Laumer
2004-01-20 17:58
2004.05.02
Как выключить другие звуки и вывести свой


6-1079013081
webmaster
2004-03-11 16:51
2004.05.02
Список групп, и расшареные папочки..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский