Visual Cpp에서 만든 dll을 BCB, Delphi, VC에서 동적 연결로 이용하기

From YYpBD's MediaWiki

Jump to: navigation, search
보통은 VC에서 Dll을 만든 다음 생성된 Lib를 이용해서 정적 연결해서 이용한다.

하지만 dll이 없다거나 할때 에러처리가 난감하다

머 방법이 없는 것은 아니나 메인 어플 자체가 안뜰 경우가 있으므로 LoadLibrary가 더 유용할 수 있겠다.


우선 VC에서 dll을 만들어본다.

dll 프로젝트를 만들고

#define DllExport   __declspec( dllexport )

extern "C"
{

DllExport int Subtract( int a, int b )
{
  return a-b;
}

}

머 테스트니 간단하게 코딩한다.

호출하는 쪽에서 바꿀수 있으니 stdcall과 cdecl등 호출 규칙은 알아서 한다 -_-;;;

그리고 exports.def에
EXPORTS
        Subtract;
를 추가한다.


[BCB에서 이용하기]

    HINSTANCE   hVCDll;

    int ( __cdecl* Subtract )(int a, int b);

    hVCDll = LoadLibrary( "VCTestDll.dll" );

    Subtract = (int (__cdecl*)(int a, int b))GetProcAddress(hVCDll, "Subtract");

    ShowMessage( IntToStr(Subtract(2, 3)) );


    FreeLibrary( hVCDll );

디파인으로 타입을 지정하면 더 편하게 쓸 수 있다.


[Delphi에서 이용하기]

type
  TSubtract = function(a, b: integer): integer; cdecl;
var
  hVCDll: HINST;
  Subtract: TSubtract;
begin
  hVCDll := LoadLibrary( 'VCTestDll.dll' );

  @Subtract := GetProcAddress( hVCDll, 'Subtract' );
  ShowMessage( IntToStr(Subtract(2, 3)) );

  FreeLibrary( hVCDll );


[VC에서 이용하기]

    HINSTANCE   hVCDll;
        char sTemp[20];

    int ( __cdecl* Subtract )(int a, int b);


    hVCDll = LoadLibrary( "VCTestDll.dll" );

    Subtract = (int (__cdecl*)(int a, int b))GetProcAddress(hVCDll, "Subtract");
        sprintf( sTemp, "%d", Subtract(2, 3) );

        AfxMessageBox( sTemp, MB_OK|MB_ICONINFORMATION, 0 );

    FreeLibrary( hVCDll );
맞춤검색