Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1223818412
Yura
2008-10-12 17:33
2008.11.23
Где найти описание - DBGridEh? (или статью с примерами)


4-1198642093
Black_Tomcat
2007-12-26 07:08
2008.11.23
Отловить сообщение во втором потоке созданным CreateThread


15-1220610012
Palladin
2008-09-05 14:20
2008.11.23
Программирование на c++ глазами хакера


2-1223903376
VIP77
2008-10-13 17:09
2008.11.23
Как получить login текущего пользователя?


15-1222264593
Vlad Oshin
2008-09-24 17:56
2008.11.23
Навеяло статьей с КД. Удивительно..