Есть ли возможность конвертнуть прицепленные исходники небольшой библиотеки в такие obj, которые бы понимал борландовский компилятор delphi? Опробованы (безрезультатно) такие методы, как: 1) создание OMF obj с помощью ml /c /ID:\masm32\includeex\ *.asm 2) COFF obj --> coff2omf by Walter Oney --> omf2d by EliCZ 3) COFF/OMF by ml --> objconv by Agner Fog 4) и еще различные вариации с применением вышеуказанных утилит... При компиле делфийского проекта получаю или "Bad object file format...", или "Unsatisfied forward or external declaration" Нужна помощь!
GroundHog Пробовал это с различными опциями, то obj файлы резко худеют до сотен байт, то "Unsatisfied forward or external declaration"...
Relic Попробуй создать библиотеку при помощи borland'овского tlib'а Code (Text): ml.exe /c *.asm tlib.exe pnglib.lib @listobj.rsp где содержимое listobj.rsp Code (Text): + adler.obj & + cdebug.obj & + CRC.obj & + data.obj & + helper.obj & + PNGI_BitmapInfo.obj & + PNGI_copymethods.obj & + PNGI_Decompress.obj & + PNGI_DeInterlaceProcs.obj & + PNGI_GenHufTable.obj & + PNGI_GetDecompressedSize.obj & + PNGI_GetNextChunk.obj & + PNGI_LoadHeader.obj & + PNG_Cleanup.obj & + PNG_CreateBitmap.obj & + PNG_Decode.obj & + PNG_GetPalette.obj & + PNG_Init.obj & + PNG_LoadCustom.obj & + PNG_LoadFile.obj & + PNG_LoadResource.obj & + PNG_OuputRaw.obj ps afaik твои исходники неполные, я взял оригинальные PNGlib: a free PNG decoder library. библиотеку, которая получилась у меня, прицепить не могу, нет окошка для аттача
q_q Кхм.. delphi не понимает static lib'ы, только obj. Можно ли исходники этой либы скомпилировать TASM'ом, тогда бы точно получился борландовский OMF obj? Я пробовал, но нарвался на кучу ошибок при компиляции
Relic Тогда достаточно ml.exe /c *.asm. Будет омф. Создать юнит, например, pnglib, поместить в него что-то типа Code (Text): unit PNGLib; interface uses Windows; {$L adler.obj} {$L cdebug.obj} {$L CRC.obj} {$L data.obj} {$L helper.obj} {$L PNGI_BitmapInfo.obj} {$L PNGI_copymethods.obj} {$L PNGI_Decompress.obj} {$L PNGI_DeInterlaceProcs.obj} {$L PNGI_GenHufTable.obj} {$L PNGI_GetDecompressedSize.obj} {$L PNGI_GetNextChunk.obj} {$L PNGI_LoadHeader.obj} {$L PNG_Cleanup.obj} {$L PNG_CreateBitmap.obj} {$L PNG_Decode.obj} {$L PNG_GetPalette.obj} {$L PNG_Init.obj} {$L PNG_LoadCustom.obj} {$L PNG_LoadFile.obj} {$L PNG_LoadResource.obj} {$L PNG_OuputRaw.obj} function PNG_Init(LPPNGINFO pPNGInfo) : BOOL; stdcall; external; function PNG_Cleanup(LPPNGINFO pPNGInfo) : BOOL; stdcall; external; function PNG_LoadFile(LPPNGINFO pPNGInfo, LPSTR lpFileName) : BOOL; stdcall; external; function PNG_LoadResource(LPPNGINFO pPNGInfo, HMODULE hInstance, LPSTR lpResName) : BOOL; stdcall; external; function PNG_LoadCustom(LPPNGINFO pPNGInfo, LPBYTE lpData, DWORD lnData) : BOOL; stdcall; external; function PNG_Decode(LPPNGINFO pPNGInfo) : BOOL; stdcall; external; function PNG_GetPalette(LPPNGINFO pPNGInfo, LPVOID lpOutput, DWORD dwFormat) : BOOL; stdcall; external; function PNG_OutputRaw(LPPNGINFO pPNGInfo, LPBYTE lpDest, DWORD dwFormat) : BOOL; stdcall; external; function PNG_CreateBitmap(LPPNGINFO pPNGInfo, HWND hWndCompatible, DWORD dwFormat, BOOL bDDB) : HBITMAP; stdcall; external; + определить тип PNGINFO и LPPNGINFO + определить константы
Max Спасибо за линк. С этой проблемой ("Unsatisfied forward or external declaration"), я думаю, разберусь. Но у меня еще затык и в другом: на два obj полученных из PNGI_Decompress.asm и PNGI_DeInterlaceProcs.asm получаю ошибку "Bad object file format..." ! Вот от этого бы как избавиться? omf2d не помогло q_q Такой юнит уже написал, см. ниже, но есть ошибки, см. выше Code (Text): unit PNGlib_; interface uses Windows; const (****************************************************************************** Copyproc types, used to build the PNG_OUTF_* values ******************************************************************************) PNGCP_X_X = 0; PNGCP_16_16 = 1; PNGCP_16_16_BGR = 2; PNGCP_16_16_BGR_SA = 3; PNGCP_16_16_BGRA = 4; PNGCP_16_16_SA = 5; PNGCP_16_8 = 6; PNGCP_16_8_BGR = 7; PNGCP_16_8_BGR_SA = 8; PNGCP_16_8_BGRA = 9; PNGCP_16_8_SA = 10; PNGCP_2_4 = 11; PNGCP_8_8_BGR = 12; PNGCP_8_8_BGR_SA = 13; PNGCP_8_8_BGRA = 14; PNGCP_8_8_SA = PNGCP_16_8; (****************************************************************************** Output formats ******************************************************************************) PNG_OUTF_G1_G1 = $00010100+PNGCP_X_X; (*DIB default*) PNG_OUTF_G2_G2 = $00020000+PNGCP_X_X; PNG_OUTF_G2_G4 = $00020100+PNGCP_2_4; (*DIB default*) PNG_OUTF_G4_G4 = $00040100+PNGCP_X_X; (*DIB default*) PNG_OUTF_G8_G8 = $00080100+PNGCP_X_X; (*DIB default*) PNG_OUTF_G16_G16 = $00100000+PNGCP_16_16; PNG_OUTF_G16_G8 = $00100100+PNGCP_16_8; (*DIB default*) PNG_OUTF_T8_T8_BGR = $02080100+PNGCP_8_8_BGR; (*DIB default*) PNG_OUTF_T16_T16_BGR = $02100000+PNGCP_16_16_BGR; PNG_OUTF_T16_T8_BGR = $02100100+PNGCP_16_8_BGR; (*DIB default*) PNG_OUTF_P1_P1 = $03010100+PNGCP_X_X; (*DIB default*) PNG_OUTF_P2_P2 = $03020000+PNGCP_X_X; PNG_OUTF_P2_P4 = $03020100+PNGCP_2_4; (*DIB default*) PNG_OUTF_P4_P4 = $03040100+PNGCP_X_X; (*DIB default*) PNG_OUTF_P8_P8 = $03080100+PNGCP_X_X; (*DIB default*) PNG_OUTF_GA8_GA8 = $04080000+PNGCP_X_X; PNG_OUTF_GA8_G8 = $04080100+PNGCP_8_8_SA; (*DIB default*) PNG_OUTF_GA16_GA16 = $04100000+PNGCP_16_16; PNG_OUTF_GA16_G16 = $04100000+PNGCP_16_16_SA; PNG_OUTF_GA16_GA8 = $04100000+PNGCP_16_8; PNG_OUTF_GA16_G8 = $04100100+PNGCP_16_8_SA; (*DIB default*) PNG_OUTF_TA8_TA8_BGRA = $06080100+PNGCP_8_8_BGRA; (*DIB default*) PNG_OUTF_TA8_T8_BGR = $06080100+PNGCP_8_8_BGR_SA; (*DIB optional*) PNG_OUTF_TA16_TA16_BGRA = $06100000+PNGCP_16_16_BGRA; PNG_OUTF_TA16_T16_BGR = $06100000+PNGCP_16_16_BGR_SA; PNG_OUTF_TA16_TA8_BGRA = $06100100+PNGCP_16_8_BGRA; (*DIB default*) PNG_OUTF_TA16_T8_BGR = $06100100+PNGCP_16_8_BGR_SA; (*DIB optional*) PNG_OUTF_AUTO = -1; (****************************************************************************** Error codes ******************************************************************************) PNGLIB_ERR_OPENFILE = $1000; (*Couldn't open file*) PNGLIB_ERR_MEMALLOC = $1001; (*Couldn't allocate memory*) PNGLIB_ERR_ALREADY_LOADED = $1002; (*Other data has already been loaded*) PNGLIB_ERR_INVALIDPNG = $2000; (*Corrupt or invalid PNG*) PNGLIB_ERR_UNSUPPORTED = $2001; (*PNG format not supported*) PNGLIB_ERR_INVALIDFORMAT = $2002; (*User error (!): Invalid format specified*) PNGLIB_ERR_WRONGSTATE = $2003; (*User error (!): Function call at the wrong time*) (*(e.g. decoding before loading data)*) PNGLIB_ERR_NOPALETTE = $2004; (*Palette requested for a non-paletted image*) PNGLIB_ERR_INVALIDPARAMETER = $2005; (*Invalid parameter used for function*) PNGLIB_ERR_CREATEBITMAP = $2006; (*Couldn't create bitmap*) PNGLIB_ERR_FINDRESOURCE = $3001; (*Couldn't find resource*) PNGLIB_ERR_LOADRESOURCE = $3002; (*Couldn't load resource*) PNG_PF_RGB = 0; (*output: red byte, green byte, blue byte*) PNG_PF_BGRX = 1; (*output: blue byte, green byte, red byte, zero byte*) type LPPNGINFO = ^_PNGINFO; _PNGINFO = packed record iWidth: cardinal; // Width of image iHeight: cardinal; // Height of image dwLastError: cardinal; // Last error code (PNGLIB_ERR_* ) nColors: cardinal; // Number of palette entries, if present PNGColorType: BYTE; // Original PNG color type (PNG_CT_* ) PNGBitDepth: BYTE; // Original PNG bit depth (bits/sample) PNGInterlaced: BYTE; // Interlace method (PNG_IM_* ) // The following structure members are used internally // by PNGlib. You should not rely in any way on these values, // nor assume they will be present in later versions. // They are included *only* to reserve space for them. lpPNGData: PByte; lnPNGData: cardinal; lpCurrent: PByte; lpOutput: PByte; lnOutput: cardinal; pPNGPalette: PByte; dwLoadType: cardinal; pHeader: PByte; pIDAT: PByte; curState: cardinal; end; (****************************************************************************** Function declararations ******************************************************************************) function _PNG_Init(pPNGInfo: LPPNGINFO): bool; stdcall; function _PNG_Cleanup(pPNGInfo: LPPNGINFO): bool; stdcall; function _PNG_LoadFile(pPNGInfo: LPPNGINFO; lpFileName: PChar): bool; stdcall; function _PNG_LoadResource(pPNGInfo: LPPNGINFO; hInstance: HMODULE; lpResName: PChar): bool; stdcall; function _PNG_LoadCustom(pPNGInfo: LPPNGINFO; lpData: PByte; lnData: cardinal): bool; stdcall; function _PNG_Decode(pPNGInfo: LPPNGINFO): bool; stdcall; function _PNG_GetPalette(pPNGInfo: LPPNGINFO; lpOutput: pointer; dwFormat: cardinal): bool; stdcall; function _PNG_OutputRaw(pPNGInfo: LPPNGINFO; lpDest: PByte; dwFormat: cardinal): bool; stdcall; function _PNG_CreateBitmap(pPNGInfo: LPPNGINFO; hWndCompatible: HWND; dwFormat: cardinal; bDDB: bool): HBITMAP; stdcall; implementation {$L PNG_Init.obj} {$L adler.obj} {$L cdebug.obj} {$L CRC.obj} {$L data.obj} {$L helper.obj} {$L PNG_Cleanup.obj} {$L PNG_CreateBitmap.obj} {$L PNG_Decode.obj} {$L PNG_GetPalette.obj} {$L PNG_LoadCustom.obj} {$L PNG_LoadFile.obj} {$L PNG_LoadResource.obj} {$L PNG_OuputRaw.obj} {$L PNGI_BitmapInfo.obj} {$L PNGI_copymethods.obj} {$L PNGI_Decompress.obj} {$L PNGI_DeInterlaceProcs.obj} {$L PNGI_GenHufTable.obj} {$L PNGI_GetDecompressedSize.obj} {$L PNGI_GetNextChunk.obj} {$L PNGI_LoadHeader.obj} function _PNG_Init(pPNGInfo: LPPNGINFO): bool; stdcall; external; function _PNG_Cleanup(pPNGInfo: LPPNGINFO): bool; stdcall; external; function _PNG_LoadFile(pPNGInfo: LPPNGINFO; lpFileName: PChar): bool; stdcall; external; function _PNG_LoadResource(pPNGInfo: LPPNGINFO; hInstance: HMODULE; lpResName: PChar): bool; stdcall; external; function _PNG_LoadCustom(pPNGInfo: LPPNGINFO; lpData: PByte; lnData: cardinal): bool; stdcall; external; function _PNG_Decode(pPNGInfo: LPPNGINFO): bool; stdcall; external; function _PNG_GetPalette(pPNGInfo: LPPNGINFO; lpOutput: pointer; dwFormat: cardinal): bool; stdcall; external; function _PNG_OutputRaw(pPNGInfo: LPPNGINFO; lpDest: PByte; dwFormat: cardinal): bool; stdcall; external; function _PNG_CreateBitmap(pPNGInfo: LPPNGINFO; hWndCompatible: HWND; dwFormat: cardinal; bDDB: bool): HBITMAP; stdcall; external; function _wsprintf(Output: PChar; Format: PChar): Integer; stdcall; varargs; external 'user32.dll' name 'wsprintfA'; end. PS Что-то криво как-то тут форматирование выглядит...