Форум: "Основная";
Текущий архив: 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.042 c