천객만래 [千客萬來] (It has an interminable succession of visitors)

[개발/MFC] regsvr32.exe 를 사용하지 않고 ActiveX DLL을 레지스트리에 등록하기

activeX DLL 을 regsvr32를 사용하지 않고 등록하는 방법이 델파이로 된게 있어서 가져왔다.
직접 만들어서 해볼려고 하니 시간이 부족하다...


Unit Unit1;

Interface

Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

Type
TForm1 = Class(TForm)
btRegistryDll: TButton;
btUnRegistryDll: TButton;
Procedure btRegistryDllClick(Sender: TObject);
Procedure btUnRegistryDllClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
End;

Var
Form1: TForm1;

Implementation

{$R *.DFM}

Procedure TForm1.btRegistryDllClick(Sender: TObject);
Type
TDllRegisterServer = Function: HResult; stdcall;
Var
DllRegisterServer: TDllRegisterServer;
hinstance1: HINST;
Begin
hinstance1 := LoadLibrary('Project2.dll');
DllRegisterServer := GetProcAddress(hinstance1, 'DllRegisterServer');
If Assigned(DllRegisterServer) Then DllRegisterServer;
FreeLibrary(hinstance1);
End;

Procedure TForm1.btUnRegistryDllClick(Sender: TObject);
Type
TDllUnregisterServer = Function: HResult; stdcall;
Var
DllUnregisterServer:TDllUnregisterServer;
hinstance1: HINST;
Begin
hinstance1 := LoadLibrary('Project2.dll');
DllUnregisterServer := GetProcAddress(hinstance1, 'DllUnregisterServer');
If Assigned(DllUnregisterServer) Then DllUnregisterServer;
FreeLibrary(hinstance1);
End;

End.


출처: http://blog.naver.com/erroring/150097804539

 
Posted by SB패밀리


ANSI 또는 유니코드 컨트롤 버전

컨트롤을 ANSI 버전으로 제공할지 유니코드 버전으로 제공할지 또는 두 버전을 모두 제공할지 여부를 결정해야 합니다. 이러한 사항은 ANSI 및 유니코드 문자 집합 고유의 이식성과 관련된 요소에 따라 결정됩니다.

모든 Win32 운영 체제에서 작동하는 ANSI 컨트롤을 사용하면 다양한 Win32 운영 체제 간의 이식성을 최대화할 수 있습니다. 반면, 유니코드 컨트롤은 Windows NT(버전 3.51 이상)에서만 작동하고 Windows 95나 Windows 98에서는 작동하지 않습니다. 따라서 이식성 문제가 주요 관심사인 경우에는 ANSI 컨트롤을 제공해야 합니다. Windows NT에서만 컨트롤을 실행할 계획인 경우에는 유니코드 컨트롤을 제공할 수 있습니다. 또한 두 가지 버전을 모두 제공하여 해당 응용 프로그램에서 사용자의 운영 체제에 따라 가장 적절한 버전을 설치하도록 할 수도 있습니다.

ActiveX 컨트롤 및 재배포 가능한 DLL 설치

ActiveX 컨트롤과 함께 제공되는 설치 프로그램을 통해 Windows 디렉터리에 별도의 하위 디렉터리를 만들고 이 하위 디렉터리에 해당 컨트롤의 .OCX 파일이 설치되도록 해야 합니다.

참고   설치 프로그램에 Windows GetWindowsDirectory API를 사용하면 Windows 디렉터리의 이름을 가져올 수 있습니다. 또한 사용자의 회사 또는 제품 이름을 사용하여 하위 디렉터리 이름을 만들 수도 있습니다.
설치 프로그램을 통해 Windows 시스템 디렉터리에 재배포 가능한 필수 DLL 파일이 설치되어야 합니다. 또한 사용자의 시스템에 필수 DLL 중 하나라도 이미 설치되어 있는 경우, 설치 프로그램에서 해당 DLL의 버전과 설치하려는 DLL의 버전을 비교한 후 이미 설치된 파일보다 설치하려는 파일의 버전 번호가 더 높은 경우에만 해당 파일을 다시 설치하도록 해야 합니다.

ActiveX 컨트롤은 OLE 컨테이너 응용 프로그램 내에서만 사용할 수 있으므로 모든 OLE DLL을 컨트롤과 함께 배포하지 않아도 됩니다. 이것이 가능한 이유는 포함하는 응용 프로그램이나 운영 체제 자체에 표준 OLE DLL이 설치되어 있기 때문입니다.

컨트롤 등록

컨트롤을 사용하려면 먼저 Windows 등록 데이터베이스에 해당 컨트롤에 대한 적절한 엔트리를 만들어야 합니다. 일부 ActiveX 컨트롤 컨테이너는 사용자가 새 컨트롤을 등록할 수 있도록 메뉴 항목을 제공하지만 모든 컨테이너에서 이 기능을 사용할 수 있는 것은 아닙니다. 따라서 컨트롤 설치 시 설치 프로그램에서 해당 컨트롤을 등록하도록 만들 수 있습니다. 이 경우, Visual C++에는 컨트롤을 등록하는 데 사용할 수 있는 RegSvr32.exe라는 재배포 가능한 프로그램이 포함되어 있으므로, 이 RegSvr32에 해당 컨트롤에 대한 .OCX 파일의 전체 경로 및 파일 이름을 인수로 전달하기만 하면 됩니다. MFC ActiveX 컨트롤 REGSVR 샘플에는 RegSvr32.EXE에 대한 소스 코드가 포함되어 있습니다. 이 샘플은 등록 작업을 수행하는 데 사용할 수 있는 방법에 대한 한 가지 예로, 사용자가 직접 등록 루틴을 만들 때 지침으로 사용할 수 있습니다.

원하는 경우에는 사용자 대신 설치 프로그램에서 컨트롤을 직접 등록하도록 만들 수도 있습니다.

LoadLibrary Windows API를 사용하여 해당 컨트롤의 DLL을 로드합니다. 그런 다음, GetProcAddress를 사용하여 "DllRegisterServer" 함수의 주소를 가져옵니다. 마지막으로, DllRegisterServer 함수를 호출합니다. 다음 코드 샘플에서는 이 경우에 사용할 수 있는 한 가지 방법을 보여 줍니다. 여기에서 hLib에는 컨트롤 라이브러리의 핸들이 저장되고 lpDllEntryPoint에는 "DllRegisterServer" 함수의 주소가 저장됩니다.

 

 

HINSTANCE hLib = LoadLibrary(pszDllName);

if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
   DisplayMessage(IDS_LOADLIBFAILED, pszDllName); //unable to load DLL
   iReturn = FAIL_LOAD;                           //unable to load DLL
}

// Find the entry point.
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,
   _T("DllRegisterServer"));
if (lpDllEntryPoint != NULL)
   (*lpDllEntryPoint)();
else
   // Unable to locate entry point

 


컨트롤을 직접 등록하면 별도의 프로세스(즉, REGSVR32)를 호출하거나 로드할 필요가 없으므로 설치 시간이 줄어든다는 장점이 있습니다. 또한 이 경우 등록 작업은 내부 프로세스이기 때문에 외부 프로세스보다는 설치 프로그램에서 오류 및 예측할 수 없는 상황을 좀 더 적절하게 처리할 수 있습니다.

참고   설치 프로그램에서 ActiveX 컨트롤을 설치하기 전에 OleInitialize를 호출해야 합니다. 또한 설치 프로그램을 종료할 때에는 OleUnitialize를 호출해야 합니다. 그래야만 OLE 시스템 DLL이 ActiveX 컨트롤을 올바르게 등록할 수 있습니다.
MFCx0.DLL은 사용자가 등록해야 합니다.


출처: http://msdn.microsoft.com/ko-kr/library/cc451427(VS.71).aspx

Posted by SB패밀리