Текущий архив: 2008.11.23;
Скачать: CL | DM;
Вниз
Перевод Си-шного файла-описателя: ошибка при инициализации Найти похожие ветки
← →
Michael (2008-10-10 11:56) [0]Добрый день!
Вынужден использовать стороннюю библиотеку, написанную на Си. Описатель имеет следующий вид (привожу текст файла поностью, ибо боюсь, что что-то не учел):
#include "Windows.h"
#include <stdio.h>
#include <io.h>
#ifndef __READ_OSC
#define __READ_OSC
#ifdef READ_OSC_EXPORTS
#define READ_OSC_API __declspec(dllexport)
#else
#define READ_OSC_API __declspec(dllimport)
#endif
extern "C" READ_OSC_API unsigned int Read_osc_dll(HANDLE hcom, HANDLE hfile);
extern "C" READ_OSC_API unsigned int Read_events_dll(HANDLE hcom, HANDLE hfile);
#ifdef READ_OSC_EXPORTS
static unsigned char bt[5] = {0x10,0x10,0x00,0x00,10};
static BYTE bBuffer[254];
bool ReceiveEvent(HANDLE hcom, BYTE* bRxBuffer);
bool ConvertEvent(BYTE* bRxBuffer, FILE* lpfProtocol);
void FindRecord(FILE* lpfZapis,FILE* lpfProtocol,BYTE* bRxBuffer,DWORD dwPoint_Buf);
void WriteIntoFile(FILE* lpfSavefd,DWORD dwCountByte,BYTE* bRxBuffer);
#endif
#endif
Для использования в проекте написал собстенный пасик. Код:
unit read_osc;
interface
const
LIB_NAME = "read_osc.dll";
function Read_osc_dll(hcom : THANDLE; hfile : THANDLE ) : Cardinal; stdcall;
function Read_events_dll(hcom : THANDLE; hfile : THANDLE ): Cardinal; stdcall;
implementation
function Read_osc_dll; external LIB_NAME;
function Read_events_dll; external LIB_NAME;
end.
Компилятор ни ошибок, ни хинтов не выдает. При попытке выполнения проекта вылетает ошибка: " Ошибка при инициализации приложения (адрес) ".
Где я ошибся? Заранее благодарен.
← →
clickmaker © (2008-10-10 11:59) [1]а где в сишном файле намек на stdcall?
← →
Сергей М. © (2008-10-10 12:55) [2]
> Где я ошибся?
Либо не найден исп.подуль библиотеки либо в ней не найдено имя импортируемого идентификатора
← →
Michael (2008-10-10 13:08) [3]
> clickmaker © (10.10.08 11:59) [1]
> а где в сишном файле намек на stdcall?
Насколько я понимаю, указание метода вызова stdcall как раз и соответсвует СИ-шному, т.е. параметры передаются в стек справа-налево. Написал именно для совместимости с библиотекой, написаной на СИ. Я не прав?
> Либо не найден исп.подуль библиотеки либо в ней не найдено
> имя импортируемого идентификатора
Библиотеку бросил в директорию с исполняемым файлом проекта. Значит ли это, что вариант один - ошибка в библиотеке?
← →
clickmaker © (2008-10-10 13:14) [4]> указание метода вызова stdcall как раз и соответсвует СИ-
> шному
нет
в си по умолчанию используется cdecl
← →
Michael (2008-10-10 13:15) [5]Мне кажется, я нашел причину ошибки. Начал просматривать параметры библиотеки, на вкладке "DLL Dependency", имеется ссылка на библиотеку MSVCR.dll, отсутствующую у меня. Буду ее гуглить.
← →
clickmaker © (2008-10-10 13:17) [6]
Keyword Stack cleanup Parameter passing
cdecl Caller Pushes parameters on the stack, in reverse order (right to left)
clrcall n/a Load parameters onto CLR expression stack in order (left to right).
stdcall Callee Pushes parameters on the stack, in reverse order (right to left)
fastcall Callee Stored in registers, then pushed on stack
thiscall Callee Pushed on stack; this pointer stored in ECX
(с) MSDN
← →
Michael (2008-10-10 13:20) [7]
> нетв си по умолчанию используется cdecl
И что? stdcall отличается от cdcel только удалением передаваемых параметров из стека. А порядок вызова у них отинаковый...
← →
Сергей М. © (2008-10-10 13:30) [8]
> stdcall отличается от cdcel только удалением передаваемых
> параметров из стека
Ты считаешь это мало что значащим фактом ?
← →
Michael (2008-10-10 13:37) [9]
> cdecl Caller Pushes parameters on the stack,
> in reverse order (right to left) clrcall n/a
> Load parameters onto CLR expression stack in order (left
> to right). stdcall Callee Pushes parameters on
> the stack, in reverse order (right to left) fastcall Callee
> Stored in registers, then pushed on stack thiscall
> Callee Pushed on stack; this pointer stored in ECX(с)
> MSDN
For all conventions except cdecl, the procedure or function removes parameters from the stack upon returning. With the cdecl convention, the caller removes parameters from the stack when the call returns.
Calling conventions
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
DelphiHelp
← →
Michael (2008-10-10 13:41) [10]
> Сергей М. © (10.10.08 13:30) [8]
> > stdcall отличается от cdcel только удалением передаваемых
> > параметров из стекаТы считаешь это мало что значащим фактом
> ?
С точки зрения разработки - нет, не считаю. С точки зрения появления "Ошибки при инициализации приложения" - да, считаю это малозначительным.
← →
Michael (2008-10-10 13:45) [11]
> [5]
Устранить ошибку путем добавления библиотеки MSVCR90.dll не удалось. Проблема остается в силе.
Попробовал в качестве директив вызова функция все допустимые варианты. Результат не изменился.
← →
Сергей М. © (2008-10-10 13:49) [12]
> имеется ссылка на библиотеку MSVCR.dll
Если требуется MSVCR.dll, то и выполни это требование !
С какого перепугу ты добавляешь MSVCR90.dll, если требуется именно MSVCR.dll ?
← →
Michael (2008-10-10 13:58) [13]
> Если требуется MSVCR.dll, то и выполни это требование !С
> какого перепугу ты добавляешь MSVCR90.dll, если требуется
> именно MSVCR.dll ?
Извините за невнимательность. Требовалась именно MSVCR90.dll. В [5] упустил цифры.
Попробую конкретизировать стоящую проблему: ошибка появляется вследствие некорректного перевода мной файла-описателя, ошибки в библиотеке или иных причин, выяснить которые посредстом форума не представляется возможным?
← →
Сергей М. © (2008-10-10 14:42) [14]Скорее всего, ошибки в библ-ке read_osc.dll, потому что до вызова ф-ций из нее дело явно не доходит
Ошибка, вероятно, возникает на стадии загрузки и/или инициализации этой библ-ки, возможно, из-за не разрешаемых статических и/или динамических ее зависимостей от других библ.модулей.
← →
Michael (2008-10-10 14:47) [15]
> clickmaker ©
> Сергей М. ©
Спасибо за рассмотрение вопроса.
← →
Сергей М. © (2008-10-10 15:19) [16]Предлагаю выполнить загрузку динамически, тогда можно будет детально проанализировать результаты загрузки и причины отказа
← →
МистерТ (2008-10-10 16:03) [17]> Устранить ошибку путем добавления библиотеки MSVCR90.dll
> не удалось. Проблема остается в силе.
И не факт что таким образом удастся...
MSVCR90.dll - это только одна из библиотек VC9 Run-Time, куда входят минимум msvcp90.dll, msvcr90.dll и msvcm90.dll
Поэтому сперва надо бы установить пакет vcredistmin_x86.exe (~3.9МБ) а потом вновь проверить работу библиотеки.
Или, если есть возможность пересобрать read_osc.dll без привязки к сишному run-time, то стоит это сделать. В результате read_osc.dll "вырастет" килобайт на 80, но зато не будет требовать нестандартных библиотек.
← →
МистерТ (2008-10-10 16:05) [18]в догонку vcredistmin_x86.exe нужен от VC9 (VS2008), есть еще от VC8 (VS2005), он не подойдет.
← →
Сергей М. © (2008-10-10 16:10) [19]
> МистерТ (10.10.08 16:03) [17]
+1
Несмотря на то что в стат.импорте у MSVCR90.dll не фигурирует ни одна из перечисленных библиотек, выяснить неявные зависимости можно запустив любое работающее приложение, использующее MSVCR90.dll, и посмотреть любым подходящим инструментом список модулей с именами MSVC*.DLL
Страницы: 1 вся ветка
Текущий архив: 2008.11.23;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.016 c