|
VC++에 있는 LIB 파일들은 빌더에서 바로 사용하지 못합니다.
이유는 DLL구조가 VC++에서 생성한것과 빌더에서 생성한것이 서로 틀리기 때문입니다.
따라서 VC++에서 만든 LIB를 빌더에서 사용하려면 Coff2Omf.exe라는 빌더의 유틸리티로
변환을 해서 사용하시면 됩니다.
에러 메세지가 바로 그런 의미입니다.(맞나? ^^)
Coff2Omf.exe는 빌더가 설치된 위치에서 BIN폴더에 있습니다.
--- Change World ---
임승택 님이 쓰신 글 :
: 임프님의 글.. Tip'N Tricks의 184번을 보고 구현하려다..
:
: wininet.lib/h 를 예제프로그램의 폴더에 저장해서 빌드를 하면 링크에러가 나네요..
:
: 물론 Visual C++ 6.0의 것을 갖다가 썼습니다만..
:
: [Linker Error] 'D:\TEMP\TEST\WININET.LIB' contains invalid OMF record, type 0x21 (possibly COFF).
:
: 혹시 다른걸 써야 하는건지..
:
: 아님 제가 잘 몰라서 그런건지..
:
: 참고로 임프님의 오리지널 글입니다.. (무단 발췌라면.. 용서를 ㅠ.ㅠ;;)
:
:
:
: 임프랍니다.
:
: 다음은 IE의 일부로 윈도우즈의 모든 버전에 설치되어 있는 WinInet API를 이용하여 웹 상의 파일을
: 다운받는 소스입니다. 옛날에 작성한 거라서 기억이 가물거리지만, MSDN에서 긁어온 것을 약간 수정한 것
: 같네요.
:
: //---------------------------------------------------------------------------
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit1.h"
: #include "wininet.h" // WinInet 헤더 인클루드
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: #pragma link "wininet.lib" // WinInet 라이브러리 링크
: TForm1 *Form1;
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
: : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
:
: bool __fastcall GetHttpFile(AnsiString StrUrl, TStream *Stream)
: {
: Stream->Position = 0;
:
: HINTERNET ISession = InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
: HINTERNET HttpFile = InternetOpenUrl(ISession, StrUrl.c_str(), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
: AnsiString UrlBuff;
: UrlBuff.SetLength(1024);
: DWord BuffSize = 1024;
: if(HttpQueryInfo(HttpFile, HTTP_QUERY_CONTENT_LOCATION, UrlBuff.c_str(), &BuffSize, NULL)==false)
: {
: switch(GetLastError())
: {
: case ERROR_INSUFFICIENT_BUFFER:
: UrlBuff.SetLength(BuffSize+1);
: HttpQueryInfo(HttpFile, HTTP_QUERY_CONTENT_LOCATION, UrlBuff.c_str(), &BuffSize, 0);
: break;
:
: case ERROR_HTTP_HEADER_NOT_FOUND:
: UrlBuff = StrUrl;
: break;
:
: default:
: InternetCloseHandle(HttpFile);
: return false;
: }
: }
: char FileSizeBuff[4];
: BuffSize = sizeof(FileSizeBuff);
: bool bSizeIsKnown = HttpQueryInfo(HttpFile, HTTP_QUERY_CONTENT_LENGTH, &FileSizeBuff, &BuffSize, NULL);
: bool Result;
: DWord FileSize;
: if(bSizeIsKnown)
: {
: FileSize = atol(FileSizeBuff);
: TMemoryStream *ms;
: ms = dynamic_cast<TMemoryStream *>(Stream);
: if(ms == NULL)
: ms = new TMemoryStream;
: ms->Size = FileSize;
: DWord ByteRead;
: Result = InternetReadFile(HttpFile, ms->Memory, FileSize, &ByteRead);
: if(Result) Stream->CopyFrom(ms, 0);
: if(ms != Stream) delete ms;
: }
: else
: {
: void *Buffer = new char[2048];
: FileSize = 2048;
: DWord ByteRead;
: while(true)
: {
: Result = InternetReadFile(HttpFile, Buffer, FileSize, &ByteRead);
: if(ByteRead == 0) break;
: Stream->WriteBuffer(Buffer, ByteRead);
: }
: delete Buffer;
: }
: InternetCloseHandle(HttpFile);
: InternetCloseHandle(ISession);
: return Result;
: }
:
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: TStringStream *ss = new TStringStream("");
: AnsiString StrUrl = UrlEdit->Text;
: if(GetHttpFile(UrlEdit->Text, ss))
: RichEdit1->Lines->Text = ss->DataString;
: else
: ShowMessage("Error");
: delete ss;
: }
:
: 이 소스의 GetHttpFile() 함수는 첫번째 인자를 안시스트링 포맷의 URL, 그리고 두번째 인자로서 스트림
: 클래스를 받도록 되어있습니다. 다운받을 파일이 HTML이나 텍스트등 텍스트 포맷이면 예에서 보인 것처럼
: TStringStream을 쓰는 것이 편할 것이고, 바이너리 파일이라면 TFileStream을 쓰는 것이 좋을 겁니다.
:
: 그럼 이만...
:
|