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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.029 c
3-1081137790
Хэтч
2004-04-05 08:03
2004.05.02
Можно ли по нажатию на Button выделить строку DBGrid а ?


1-1082092275
Pirate
2004-04-16 09:11
2004.05.02
Сравнение по маске


14-1081285003
cmapm
2004-04-07 00:56
2004.05.02
Помогите создать конвертор из doc в txt............спасибо


6-1078708961
Greenpeace
2004-03-08 04:22
2004.05.02
Вопрос новичка: где поискать информацию?


7-1079348527
Legran
2004-03-15 14:02
2004.05.02
Отслеживаем обращение к диску А: