이번엔 초간단 플레이어를 만들어 보겠습니다.

먼저 DSPack 을 설치하시길 권합니다.
DirectShow9헤더 파일만 있어도 되지만 DSPack을 설치하시는게 편리합니다.
DSPack 다운로드

DSPack은 아직 공식적으로 BDS2006버전이 없습니다.
CVS에서 DSPack 2006버전을 받거나 아래에서 받으시면 됩니다.

DSPACK.zip

DSPack 2006 다운로드


준비가 되었으면 플레이어를 만들어 봅시다.


버튼 하나랑 OpenDialog 하나를 놨습니다.

코드를 작성합니다.

unit player;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DirectShow9, ActiveX;  //Directshow와 ActiveX를 추가

type
  TForm1 = class(TForm)
  Button1: TButton;
  OpenDialog1: TOpenDialog;
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  GraphBuilder: IGraphBuilder;
  MediaControl: IMediaControl;
  public
  { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    //MediaControl 인터페이스 연결
    GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);
    //파일 읽기
    GraphBuilder.RenderFile(StringToOleStr(OpenDialog1.FileName), nil);
    //재생
    MediaControl.Run;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//GraphBuilder 생성
  CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER,
  IID_IFilterGraph, GraphBuilder);
end;

end.

아주 간단한 코드입니다.
이걸로 음악파일을 물론 동영 파일도 재생됩니다.

ds_study.zip

예제파일 다운로드

물론 이것만으로 플레이어라고 하기엔 많이 부족합니다^^;
seek바가 있어서 앞으로뒤로 탐색할 수 있는 기능도 필요하고 볼륨 조절등 다양한 기능이 추가되어야 합니다.
seek같은건 IMediaSeeking 인터페이스 추가를 하여 쉽게 만들 수 있습니다.
위의 코드에 IMediaControl 인터페이스를 사용했습니다. 이 인터페이스는 Play(Run), Pause, Stop등을 할 수 있는 인터페이스입니다.

동영상을 열면 1편의 GraphEdit에서 보았듯이 ActiveMovieWindow 가 열리면서 동영상이 재생됩니다.
동영상 화면을 따로 제어하시려면 IVideoWindow 인터페이스를 사용하시면 됩니다.
인터페이스에 대한 자세한 설정은 DirectX SDK를 참고하시면 됩니다.

기초를 다루기때문에 자세한 내용은 SDK를 참고하시기 바랍니다.

3편에서는 좀더 복잡한 wav파일 변환기를 만들어 보겠습니다.

'자료들 > Delphi' 카테고리의 다른 글

화니의 DirectShow 기초 2  (1) 2006.05.30
화니의 DirectShow 기초 1  (0) 2006.05.30
Indy9 -> Indy10 으로 업데이트하기  (0) 2006.03.01
MemProof 메모리 누수 탐지  (0) 2005.09.26
Posted by 화니.

댓글을 달아 주세요

  1. 2007.05.29 17:32  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

DirectShow 많이 들어보셨을 겁니다.

DirectX에 들어있는것중 하나이지요.
DirectX에는 DirectSound, DirectMusic, DirectShow 가 있습니다.
DirectShow는 멀티미디어의 통합관리를 한다고 생각하시면 됩니다.
저도 배우면서 1주일정도 고생을 했네요.
다른분들이 좀더 쉽게 이해할 수 있었으면 좋겠습니다.

DirectShow! 조금 공부해보시면 알겠지만 핀, 필터 등의 개념이 생소합니다.
전 이 구조를 이해하는도 오래 걸렸습니다.

먼저 DirectShow를 이해하기 위해 GraphEdit 라는 프로그램이 있으면 좋습니다.


압축을 푼 후 regsvr32 proppage.dll 를 실행하여 proppage.dll 를 등록합니다.
등록을 안하셔도 일단 사용은 가능하나 자세한 설정을 하려면 필요합니다.

이제 GraphEdit 를 실행해 봅니다.
File->Render Media File...을 클릭하여 음악파일 하나를 읽어 봅니다.

위의 그림과 같이 음악파일에서 여러개가 이어진 모습이 보입니다.
이것이 DirectShow 에서 음악파일을 읽어 사운드로 출력하는 연결 구조입니다.
보라색 사각형은 필터를 의미합니다.
구조를 설명하자면 음악파일을 읽고->MPEG스트림필터를 통하고->MPEG를 디코딩하고->사운드카드로 출력을 합니다.
보시면 Output, Input, Audio, XForm In, XForm Out 등 사각형 양끝에 표시가 있습니다.
이것은 핀을 의미하고 오른쪽에 있는것이 입력핀(InputPin), 왼쪽에 있는 것이 출력핀(OutPin)입니다.
이 필터끼리 연결을 하는 것이 핀의 역활입니다.
동영상의 경우엔 영상, 사운드 두개가 나와서 출력핀이 두개로 나누어집니다.
일단 음성을 보신 후 다음에 동영상에 대해 다루겠습니다.
GraphEdit 화면에서 녹색▶버튼을 클릭하면 음악이 재생됩니다.
화면으로 보기엔 DirectShow는 간단하게 작동하시면 세밀한 작동을 위해선 각 필터와 핀을 수동으로 연결시켜주어야 합니다.

다음은 동영상 파일을 열어본 모습입니다.
위의 그림을 보면 AVI Splitter필터에서 음성과 화면을 나눌 수 있는 두개의 출력핀이 나옵니다.
두개의 출력핀에서 음성과 화면을 코덱으로 푼후 재생을 하게 됩니다.
녹색▶버튼을 누르면 ActiveMovieWindow가 뜨면서 동영상이 재생됩니다.
영상이 출력될 윈도우를 지정하지 않으면 자동으로 ActiveMovieWindow가 뜨게 됩니다.

DirectShow로 영상, 음성을 다를 수 있고 각종 코덱을 연결하여 변환기를 만들 수 있다는 것을 이해하셨을 겁니다.
좀더 생각해보시면 코덱이 없이 돌아가는 곰플레이어 같은 것도 만들 수 있습니다.
곰플레이어는 설치시 코덱을 따로 둔다음 필요할때 해당 코덱파일을 읽어서 작동할 뿐 구조는 비슷하다고 생각하시면 됩니다.

이것으로 1편을 마칩니다^0^;
다음엔 실제 코딩에 들어갑니다~

'자료들 > Delphi' 카테고리의 다른 글

화니의 DirectShow 기초 2  (1) 2006.05.30
화니의 DirectShow 기초 1  (0) 2006.05.30
Indy9 -> Indy10 으로 업데이트하기  (0) 2006.03.01
MemProof 메모리 누수 탐지  (0) 2005.09.26
Posted by 화니.

댓글을 달아 주세요

일단 참고하실 글은
http://bdn.borland.com/borcon2004/article/paper/0,1963,32160,00.html
입니다.

인디 10에서는 구조가 상당히 변했습니다.

IdTCPClient
일단 클라이언트의 전송 및 수신부분에서 변경된 내역입니다.
인디9에서 구조체전송에 아래와 같이 사용했습니다.
IdTCPClientt.WriteBuffer(Header, SizeOf(Header));

인디10에서는 구조체전송에는 아래와 같이 사용해야 합니다.
uses IdGlobal;
var
  Buf : TIdBytes;

Buf := RawToBytes(Header, SizeOf(Header));
IdTCPClientt.IOHandler.Write(Buf);

위와같이 IdTCPClientt.IOHandler 에서 전송 수신을 합니다.
구조체같은 데이타를 사용시 TIdBytes 형으로 변환후 전송해야 합니다.
그외의 것은 비슷합니다.

수신도 마찬가지로 TIdBytes 형을 사용합니다.
  IdTCPClientt.Socket.ReadBytes(Buf, SizeOf(Header));
  BytesToRaw(Buf, Header, SizeOf(Header));

IdTCPServer
서버의 사용방법도 상당히 변했습니다.
일단 AThread: TIdPeerThread 가 AContext: TIdContext 로 변경되었습니다.
Thread 가 Context로 변경되었다고 보시면 됩니다.
IdTCPServer.Threads -> IdTCPServer.Contexts

기존 인디9에서의 전송 방식입니다.
AThread.Connection.WriteBuffer(Header, Sizeof(Header));
인디10에서는 아래와 같이 사용해야 합니다.
var
  Buf : TIdBytes;

     Buf := RawToBytes(Header, Sizeof(Header));
    AContext.Connection.IOHandler.Write(Buf);

수신방식도 비슷하게 변경하시면 됩니다.
인디9의 방식
AThread.Connection.ReadBuffer(Header, Sizeof(Header));

인디10으로 변경
var
  Buf : TIdBytes;
     AContext.Connection.IOHandler.ReadBytes(Buf, Sizeof(Header));
     BytesToRaw(Buf , Header, Sizeof(Header));

그 외의 방식은 비슷합니다.
var
  Client : TClient;

  Client := TClient.Create;
  AContext.Data := Client;

주의하실점은 접속종료를 할 때 입니다.
인디9에서는
AThread.Data := nil;
Client.Free
이런식으로 처리를 했을겁니다.
하지만 인디10에서는 자동해제가 됩니다.
강제 접속해제를 하려면
AContext.Connection.Disconnect 만 해주시면 됩니다.

인디9에서 AThread.Stop; 과 같은 기능은
TIdYarnOfThread(AContent.Yarn).Thread.Stop; 로 사용하시면 됩니다.

'자료들 > Delphi' 카테고리의 다른 글

화니의 DirectShow 기초 1  (0) 2006.05.30
Indy9 -> Indy10 으로 업데이트하기  (0) 2006.03.01
MemProof 메모리 누수 탐지  (0) 2005.09.26
mIRC DLL 플러그인 만들기  (0) 2005.09.20
Posted by 화니.

댓글을 달아 주세요

http://www.automatedqa.com/


http://www.automatedqa.com/downloads/memproof/

「Project」-「Options...」의 「Project Options」화면에서


「Compiler」탭의 「Optimization」을 제외
「Compiler」탭의 「Stack frames」을 체크
「Compiler」탭의 「Debug Infomation」을 체크 (체크되어있음)
「Compiler」탭의 「Use Debug DCUs」을 체크
「Linker」탭의 「Include TD32 debug info」에 체크

'자료들 > Delphi' 카테고리의 다른 글

Indy9 -> Indy10 으로 업데이트하기  (0) 2006.03.01
MemProof 메모리 누수 탐지  (0) 2005.09.26
mIRC DLL 플러그인 만들기  (0) 2005.09.20
SSL 라이브러리 CURL  (0) 2005.06.18
Posted by 화니.

댓글을 달아 주세요

HOW TO BUILD A mIRC DLL USING DELPHI
by Rob (smiirky@hotmail.com)



 


Table of contents:


Chapter 1- What do I need, to write a DLL?
Chapter 2- How do I start?
Chapter 3- Adding functions and structures to the project.
Chapter 4 - The EXPORTS section.
Chapter 5 - Finishing the project, saving, and moving to mIRC.
Closing statement
Legal issues
 


 


Author Commentaries


As some (hopefully all) of you Delphi users probably know, Delphi 6 recently hit the shelves, but I have not purchased it, nor have I ever used it yet, so I may only assume everything here will work there as well. My Delphi acquaintences inform me that it is exactly the same thing as v5, with miniscule changes, so I'm willing to wager everything will be successful for you.


 


1. What do I need, to write a DLL?


In order to write a decent DLL for mIRC in Delphi, you will need a fair understanding of the syntax of the pascal language. You will also need a Delphi Compiler, which as far as I know, only exisits in Delphi itself (no third party/freeware compilers). You can check under the Borland site (http://www.borland.com) for more information. I use Delphi 5 for my examples, but the code should work fine for any other versions (atleast for version 3&4).


 


2. How do I start?


What I'm about to go through now is how to start a new DLL project. Remember that I'm working with Delphi 5, and even though I believe the steps are the same, some older versions might not have a presaved DLL project in the repository.


Starting procedures:


a: Select 'File' from the menubar, then select 'New'
b: Select the tab labeled 'New'
c: Choose 'DLL' (Icon with a red&blue book) This will create the bare bones for a DLL file, a Delphi .dpr (project) file.
d: Select 'Project' from the menubar, then select 'Options' at the bottom
e: Select the tab labeled 'Directories/Conditionals'
f: Under the 'Output Directory' browse to and select your mIRC folder
g: Click Okay to save the settings
h: Now, select 'File' from the menubar, and then select 'Save Project As'
i: Select a directory to save your work in, and save the project as mirc_dll.dpr


 


3. Adding functions and structures to the project


Okay, back into the DLL. It should now look like this:


library mirc_dll;


{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }


uses
  SysUtils,
  Classes;


{$R *.RES}
begin
end.



You can throw out the {$R *.RES} and the "begin" if you prefer, they are not really required in our dll. You may also do away with the big speech on passing strings in functions, though it may serve as a good reminder for those less familiar with DLLs. If you prefered to throw them out, feel free to resave your dll again.


First thing we are going to need for our DLL is the data structure associated with keeping our DLL loaded after making a call to it. So right under our "uses" section we are going to add a "type" section (type is where we define all structures, records, classes, etc.) and insert the following structure (already converted to Delphi format).


type
  TLoadInfo = packed record
    mVersion : DWORD;
    mHwnd    : HWND;
    mKeep    : Boolean;
  end;
  PLoadInfo = ^TLoadInfo;



Okay now, we're gonna add some functions. As ya might have noticed Khaled Mardam-Bey gave an example of how the functions should look, but it was only written in c/c++. For those of you that have no idea of what c/c++ is, then yer probably reading it over and over going, "what!?". So I've gone ahead and converted the functions to Delphi for us. So to get right down to it, lets start with the first function that will be called once our DLL is being loaded. Just move down past our "type" section and insert the following comment, and code (though the comments are not really neccessary).


(*
  This function is the first function being called when mIRC loads the dll.
*)
procedure LoadDll(LoadInfo: PLoadInfo); stdcall; export;
begin
  LoadInfo.mKeep := TRUE; // Tells mIRC to keep our DLL loaded
end;


Setting "mKeep" to true (as seen above) tells mIRC not to automatically close this DLL, once our function has finished executing. Setting this to false, as I'm sure you could have guessed, will tell mIRC to close the DLL after it finishes processing.
Next on the list, as well as in the same ballpark, will be our closing function, which is responsible for cleaning up anything that needs to be cleaned up (free any memory we allocated, etc.) once our DLL is about to close. So right below our LoadDll function, we'll be inserting this:


(*
  This is the closing function of the DLL
    - It is either called when you close your DLL manually,
      or after ten minutes of no calls to the DLL.
*)
procedure UnloadDll(mTimeOut: integer); stdcall; export;
begin
  case mTimeOut of
    0: messagebox(0, 'Unloading mIRC DLL...', 'You are manually closing your DLL.', MB_OK);
    1: messagebox(0, 'Unloading mIRC DLL...', 'Your DLL has timedout after 10 minutes.', MB_OK);
  end;
end;


!!! Note !!!
In order to use MessageBox and other API calls, you must add the neccessary units to the uses clause. In this case, to use MessageBox, you must add "Windows" to the units clause. So you should now have:


uses
  SysUtils,
  Windows,
  Classes;


Finally, the basics are setup, and we can now start going over the juicy part, the actual function structure. This next piece of code will not be going into our DLL (not as is anyway), it is merely an example of the format of how our functions will look in Delphi, followed by an explanation of it.


function ProcName( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
begin


end;


What the params mean are:
mWnd -> The handle of the main mirc window
aWnd -> The handle of the window the command is being issued in [*]
Data -> The data being passed to the DLL. The DLL can then alter and pass data back to mIRC.
Parms -> When passing data back to mIRC, fill this with the parms of the command passed in Data.
Show -> Returns FALSE if the "." prefix was used to make the command QUIET, else returns True.
NoPause-> Returns TRUE if mIRC is in a critical routine and the DLL must not delay processing. ex: The DLL must not popup a dialog, or something that waits for a response from user.


!!! Note !!!
* = This might not be the active window, if the dll was called from a remote script.


Return Values for our function:
0 means that mIRC should /halt processing.
1 means that mIRC should continue processing.
2 means that it has filled the data variable with a command which it wants mIRC to perform, and has filled parms with the parameters to use, if any, when performing the command.
3 means that the DLL has filled the data variable with the result that $dll() as an identifier should return.



Now that you know the specifications for the function, lets start making a function.


For my examples, I'll use the ones trbz used for his c/c++ example. So our first function will be called, ETA:


function ETA( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
begin
  strcopy(data, 'The search for E.T. will never end!');
  result := 3;
end;


Explanation of the code used in this sample:


First we declared the function ETA like we defined earlier. Next we used strcopy() to copy a string into our data variable.
I'm gonna point out here that you can't use: Data:='Blah'; You need to use: strcopy(); Next, we set our result to 3 to tell mirc that we filled our data variable with the value that the $dll() identifier should return. Then I copied a string to the data parm and last I returned 3 to mIRC.


So lets say that I wanted to echo the result of this function in mirc then I would have to call it by typing:


//echo -a $dll(mIRC_DLL.dll,ETA,NOT_USED)


This is a simple example how to fill the data parm with information and then letting mIRC get it. A good usage for this would be to use the DLL for complex calculations and return them to mIRC in a few milliseconds.


A different way to perform the same thing could be:


function ETB( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
begin
  strcopy(data, '/echo The search for E.T. will never end!');
  strcopy(parms, '-a');
  result := 2;
end;


Explanation of the code used in this sample:


This is almost the same syntax as ETA but here we use return 2 to tell mIRC that we filled the data parm with a command that we want mIRC to execute and the parms parm with a switch to use with the command. By using return code 2 you can therefor force mIRC to perform a task.


Both ways works just as good, however you have to call the last function with:


/dll mIRC_DLL.dll ETB NOT_USED


Okay, so now we got the basics down, but we want to try something more complex. Lets get our DLL to display a msgbox, displaying the data passed to the DLL.


function MsgBox( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
begin
  if NOT NoPause then
    MessageBox(mWnd, data, 'mIRC', MB_OK);
  result := 0;
end;


You can call this function by using:


/dll mIRC_DLL.dll MsgBox Hi, this is our message!


Explanation of the code used in this sample:


When it comes to popup windows and such we need to make sure that mIRC isn't in a critical moment before we popup our MessageBox or mIRC could crash. If mIRC in fact is in a critical moment, we just cancel the MessageBox.


We use return 0 in this sample and that tell mIRC that we don't have any information to return so mIRC should stop processing information from the dll.


This is also a very good example of what you can do with mIRC dll's. What we do here is that we fetch information from the data parm and use it in our MessageBox. You could make this very complex but this is a simple example.


 


4. The EXPORTS section


So now we have several functions (ETA, ETB, MsgBox) in our DLL. Even though we added 'export;' at the end of each function, we still need our exports section. Also, don't forget you must include your LoadDll and UnloadDll functions in the exports section. So after our functions, but before 'end.' we'll add in the following:


exports
  LoadDll,
  UnloadDll,
  ETA,
  ETB,
  MsgBox;


And that's all there is to exporting our functions. Just be sure to add each function name that you create, to the exports list.


 


5. Finishing the project, saving, and moving to mIRC


Now that we've added our EXPORTS and our functions lets finalize the project.


So far, here's what your DLL should look like:


library mirc_dll;


{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }


uses
  SysUtils,
  Windows,
  Classes;


type
  TLoadInfo = packed record
    mVersion : DWORD;
    mHwnd    : HWND;
    mKeep    : Boolean;
  end;
  PLoadInfo = ^TLoadInfo;


{$R *.RES}


function ETA( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
begin
  strcopy(data, 'The search for E.T. will never end!');
  result := 3;
end;


function ETB( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
begin
  strcopy(data, '/echo The search for E.T. will never end!');
  strcopy(parms, '-a');
  result := 2;
end;


function MsgBox( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
begin
  if NOT NoPause then
    MessageBox(mWnd, data, 'mIRC', MB_OK);
  result := 0;
end;


exports
  LoadDll,
  UnloadDll,
  ETA,
  ETB,
  MsgBox;


begin
end.


Now as trbz says, SAVE, SAVE, SAVE :). Thats right, File|Save this buddy, before we screw it up!


Now that we saved our work, time to compile, remember, it is a DLL, you hotkey happy programmers can't go jamming on F9, you'll receive an error about not being able to debug the project unless a host application is defined.
Instead, Choose 'Project', 'Build mirc_dll'.


Now if you followed the steps correctly, and I typed them correctly, you should now have a mirc_dll.dll in your mIRC Directory, ready for use.


You can now feel free to goto mIRC and try these functions.


//echo -a $dll(mirc_dll.dll, ETA, NOT_USED)
/dll mirc_dll.dll ETB NOT_USED
/dll mirc_dll.dll MsgBox Hi, this is just a test!


 


6. Closing statement


Okay, that's all I have for ya. This is pretty much my first tutorial on coding, and I really bit most of it off of trbz's excellent c/c++ tutorial. I figured I'd keep it the same anyway, so you could see how the two languages relate, for future reference.
If you have any problems, questions, or comments, please feel free to email me, my email is: smiirky@hotmail.com.
Write whatever you like, whether you've come up with a better method, or whether you need to know how to do something else, whatever. :)


Thanks again to trbz for his tutorial, and for posting this, to support the Delphi community as well.
-Smiirk (Rob)


 


Legal issues


mIRC is a registered trademark of mIRC Co. Ltd. Visual C++ is a registered trademark of Microsoft. C++ Builder is a registered trademark of Inprise. Delphi is a registered trademark of Inprise.


Some of the text in this file was copied from the mIRC help file.

출처 : http://mirc.stealth.net/tutorials/mirc_dll_delphi.html

'자료들 > Delphi' 카테고리의 다른 글

MemProof 메모리 누수 탐지  (0) 2005.09.26
mIRC DLL 플러그인 만들기  (0) 2005.09.20
SSL 라이브러리 CURL  (0) 2005.06.18
Dr.Bob's HeadConv - C DLL Header Converter v4.20  (0) 2005.06.09
Posted by 화니.

댓글을 달아 주세요

http://curl.haxx.se/libcurl/pascal/

Free Pascal 용 라이브러리
Delphi 에서 사용하기 위해선 src 폴더에서 makewin dcc

'자료들 > Delphi' 카테고리의 다른 글

mIRC DLL 플러그인 만들기  (0) 2005.09.20
SSL 라이브러리 CURL  (0) 2005.06.18
Dr.Bob's HeadConv - C DLL Header Converter v4.20  (0) 2005.06.09
EmbeddedWb 1.16b for 7.0  (0) 2005.06.06
Posted by 화니.

댓글을 달아 주세요

Dr.Bob's HeadConv - C DLL Header Converter v4.20

C의 헤더파일을 Delphi 형식으로 바꿔주는 프로그램
http://www.drbob42.com/headconv/

'자료들 > Delphi' 카테고리의 다른 글

SSL 라이브러리 CURL  (0) 2005.06.18
Dr.Bob's HeadConv - C DLL Header Converter v4.20  (0) 2005.06.09
EmbeddedWb 1.16b for 7.0  (0) 2005.06.06
The Indy Project  (0) 2005.02.25
Posted by 화니.

댓글을 달아 주세요

EmbeddedWb for 7.0

웹프라우져와 관련된 작업을 할 때 많은 부가기능을 제공하는 컴포넌트입니다.
WebBrowser 컴포넌트 대용으로 사용합니다.

설명 http://www.euromind.com/iedelphi/embeddedwb.htm
다운로드

'자료들 > Delphi' 카테고리의 다른 글

Dr.Bob's HeadConv - C DLL Header Converter v4.20  (0) 2005.06.09
EmbeddedWb 1.16b for 7.0  (0) 2005.06.06
The Indy Project  (0) 2005.02.25
그래픽 처리 컴포넌트  (0) 2005.02.16
Posted by 화니.

댓글을 달아 주세요