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

Вниз

Хочу чтобы меня видели !!! ( DLL )   Найти похожие ветки 

 
Сенченко Андрей   (2001-12-29 14:20) [0]

Библиотека, скомпилированная из нижеприведенного текста упорно не хочет видеться под VB.
Компилировал с флагом
build with runtime packages
rtl;vcl;vclx
Моя собственная программа видит и обрабатывает эту библиотеку нормально, а под VB на другой машине - просто пишет, что не может ее найти ( пути правильные ), то есть скорее всего итоговая DLL просто не воспинимается как библиотека.


LIBRARY convert;
uses
Windows, Graphics, JPEG;

Procedure bmp2jpg(bmpname,jpgname : string); Export;

var
JPGpic: TJPEGImage;
BMPpic: TBitmap;
begin
JPGpic := TJPEGImage.Create;
BMPpic := TBitmap.Create;
Try
BMPpic.LoadFromFile(BMPName);
JPGpic.Assign(BMPpic);
JPGpic.SaveToFile(JPGName);
Finally
JPGpic.Free;
BMPpic.Free;
End { Try }
end;

Exports
bmp2jpg index 1 name "bmp2jpg";

end.


СПАСИБО


 
Алексей Петров   (2001-12-29 14:39) [1]

Дело не в библиотеке.
На "той" машине есть rtl.bpl; vcl.bpl; vclx.bpl?


 
Андрей Сенченко   (2001-12-29 14:48) [2]

Эти есть. Поставил конечно. Только вот по-моему в недоступной по умолчанию директории.


 
Юрий Зотов   (2001-12-29 14:52) [3]

Если пути правильные, то видеться DLL должна. Ищите ошибку в коде VB.

А вот написана DLL неверно. Во-первых, передача параметров типа string допускается, если и DLL, и вызывающая программа используют борландовский менеджер памяти. В Вашем случае это невозможно, поэтому строки нужно передавать как PChar (или PWideChar - в общем то, что соответствует строкам VB).

Во-вторых, описатель Export в заголовке прцедуры не нужен (хотя это и не ошибка, просто он устарел). А вот описатель соглашения о вызове просто необходим (потому что по умолчанию будет использован pascal, который VB поддержать явно не сможет). Я плохо знаю VB, но полагаю, что в данном случае нужен описатель safecall (хотя могу и ошибаться, пусть более знающие поправят).


 
kig   (2001-12-29 15:16) [4]

Только как PChar - VB вызывает DLL (не OLE), конвертируя свои строки из BSTR в LPSTR.

Соглашание о вызове:
If you use Visual C++ (or a similar tool) to create DLLs that will be called by Visual Basic, use the __stdcall calling convention. Do not use the default calling convention (_cdecl).



 
Андрей Сенченко   (2001-12-29 15:24) [5]

Лезем в HELP

The table below summarizes calling conventions.

Directive Parameter order Clean-up Passes param..
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

The default register convention is the most efficient, since it usually avoids creation of a stack frame. (Access methods for published properties must use register.) The cdecl convention is useful when you call functions from shared libraries written in C or C++, while stdcall and safecall are recommended, in general, for calls to external code. On Windows, the operating system APIs are stdcall and safecall. Other operating systems generally use cdecl. (Note that stdcall is more efficient than cdecl.)
The safecall convention must be used for declaring dual-interface methods. The pascal convention is maintained for backward compatibility. For more information on calling conventions, see Program control.


Лезем в ссылку Dual Interface... и видим.

A dual interface is an interface that supports both compile-time binding and runtime binding through Automation. Dual interfaces must descend from IDispatch.
All methods of a dual interface (except from those inherited from IInterface and IDispatch) must use the safecall convention, and all method parameter and result types must be automatable. (The automatable types are Byte, Currency, Real, Double, Real48, Integer, Single, Smallint, AnsiString, ShortString, TDateTime, Variant, OleVariant, and WordBool.)


А допустимо ли будет использовать тип PWideChar ?


 
Андрей Сенченко   (2001-12-29 15:26) [6]

> kig (29.12.01 15:16)

Спасибо. Уже добрался !


 
kig   (2001-12-29 23:41) [7]

)))То что добрались - это хорошо))

И все же
Dual Interface
Interface
IDispatch
Это все OLE (Automation)

Если бы Вы реализовали свою ф-цию DLL в виде метода OLE-сервера,
Вам но много проще жилось в Васике ))). Вот там - точно - все строки BSTR (PWideChar).




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

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

Наверх





Память: 0.46 MB
Время: 0.004 c
14-52665
Donal
2001-11-19 13:46
2002.01.17
кто стучится в дверь моя?


14-52645
MadBurro
2001-11-20 21:55
2002.01.17
Прокси


1-52537
Русский
2001-12-27 20:31
2002.01.17
TPropertyEditor


1-52576
Irish Boy
2001-12-28 13:42
2002.01.17
Help me! Please!


1-52567
dnd
2001-12-28 11:46
2002.01.17
Подскажите пожалуйста как можно открыть файл *.r32





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