일반적으로 VB와 VC를 함께 프로그래밍하는 방법에는 세 가지가 있습니다. 하나는 VC에서 DLL을 생성하고 VB에서 DLL을 호출하는 것이고, 다른 하나는 VC에서 ActiveX 컨트롤(.ocx)을 생성하여 VB에 삽입하는 것입니다. 다른 하나는 VC에서 DLL을 생성하고 VB에서 ActiveX 자동화 서버를 생성하고 이를 VB에서 호출하는 것입니다. 상대적으로 말하면 첫 번째 방법은 VC 프로그래머에 대한 요구 사항이 가장 낮지만 파트너의 협력이 필요합니다.
먼저 VC++ 프로그래밍에 대해 이야기해 보겠습니다. 먼저 VC++에서 Win32 DLL 프로젝트를 생성합니다. VB 사용자가 호출할 수 있도록 이 프로젝트에 여러 기능을 추가합니다. VB에서 DLL의 함수를 호출하려면 두 가지 조건을 충족해야 합니다. 하나는 호출 메서드가 stdcall이고 다른 하나는 내보내야 한다는 것입니다. 첫 번째 작업을 수행하려면 함수 선언 앞에 __stdcall 키워드를 추가하면 됩니다. 좋다:
짧은 __stdcall 샘플(짧은 nLen, 짧은 *버퍼)
두 번째 작업을 수행하려면 *.def 파일에 다음 줄을 추가해야 합니다.
수출
샘플@1
여기 샘플은 VB에서 호출하려는 함수의 이름이고, @1은 DLL의 함수 번호를 나타내며 각 함수는 다릅니다. 여기서 함수 이름은 대소문자를 구분합니다. 많은 양의 데이터를 전송해야 하는 경우 배열을 사용하여 VB에 데이터를 저장한 다음 배열의 크기와 주소를 VC에 전달할 수 있습니다(VB에서 프로그래밍하는 방법은 제가 설명하겠습니다). 아래에 소개합니다.) 위의 예와 마찬가지로 nLen은 배열 크기이고 buffer는 배열 주소입니다. 이 두 항목을 사용하면 VC 배열처럼 처리할 수 있습니다. 출력 그래픽의 경우 WMF 또는 BMP 형식을 생성하고 VB에서 이를 호출하도록 할 수 있습니다. 그러나 VB가 윈도우 핸들 hWnd 및 hDC와 윈도우의 그리기 위치(VB와 VC에서 사용하는 좌표계가 일치해야 함)를 VC에 전달하는 한 윈도우에 직접 출력할 수도 있다고 생각합니다. VB의 AutoRedraw 속성은 False여야 하며 Paint 이벤트에서 VC 그리기 프로그램이 호출됩니다.
VB 프로그래밍에 대해 다시 이야기해 봅시다. VB에서 DLL을 호출하는 방법은 일반적으로 VB 서적에 소개되어 있는 Windows API를 호출하는 방법과 동일합니다. 위의 예에서는 먼저 VC 함수를 선언합니다.
함수 샘플 Lib "mydll.dll"(ByVal nLen을 정수로, 버퍼를 정수로) 정수로 선언
여기서 mydll.dll은 dll의 이름입니다. ByVal이 첫 번째 매개 변수에 추가되어 두 매개 변수가 다르게 선언되었음을 알 수 있습니다. 규칙은 다음과 같습니다. 매개 변수가 VC에서 포인터나 배열로 선언되면 ByVal이 추가되지 않고 그렇지 않으면 ByVal이 추가됩니다. VB에서 이 함수를 호출하는 데는 다음 구문이 사용됩니다.
샘플 10, a(0)
여기서 a() 배열은 데이터를 저장하는 데 사용되며 10은 배열 길이입니다. 여기서 두 번째 매개변수는 a()일 수 없지만 전달될 데이터 중 첫 번째여야 합니다. 이것이 VB 프로그래밍의 핵심입니다.
다음은 발생할 수 있는 몇 가지 문제입니다. 한 가지 문제는 VB가 dll을 찾을 수 없다고 보고할 수 있다는 것입니다. dll을 시스템 디렉터리에 넣고 VB의 Declare 문이 올바른지 확인할 수 있습니다. 또 다른 문제는 VB가 필요한 기능을 찾을 수 없다고 보고한다는 것입니다. 이는 일반적으로 *.def 파일이 VC에 설정되어 있지 않기 때문입니다. 세 번째 상황은 VB에서 변환을 수행할 수 없다고 알려주는 것입니다. 이는 __stdcall 키워드가 VC에 추가되지 않았거나 VB와 VC의 매개변수 유형이 일치하지 않기 때문일 수 있습니다. VC의 int는 4입니다. 바이트(VB Long과 동일)인 반면 VB의 Integer는 2바이트에 불과합니다. VB와 VC의 매개변수 개수가 동일해야 하며, 이들이 차지하는 바이트 수도 동일해야 합니다. 마지막으로 주의해야 할 점은 배열이 VC의 범위를 초과해서는 안 된다는 것입니다. 그렇지 않으면 VB 프로그램이 중단될 수 있습니다.
1. DLL 호출의 장점
Windows 운영 체제의 기반인 DLL(동적 링크 라이브러리)은 뛰어난 애플리케이션 성능을 제공합니다.
DLL은 애플리케이션의 기능을 확장합니다. DLL은 프로세스의 주소 공간에 동적으로 로드되기 때문에 애플리케이션은 런타임에 어떤 작업을 수행해야 하는지 결정한 다음 필요에 따라 해당 작업을 수행하기 위해 적절한 코드를 로드할 수 있습니다.
DLL은 다양한 언어로 작성될 수 있습니다. 예를 들어, VB는 응용 프로그램의 인터페이스를 작성하는 데 사용되고 C++는 알고리즘 및 통신과 같은 기본 작업을 작성하는 데 사용됩니다.
DLL은 소프트웨어 프로젝트 관리를 단순화합니다. 소프트웨어 개발 중에 서로 다른 작업 그룹이 서로 다른 모듈에 대해 작업하는 경우 프로젝트를 관리하기가 더 쉽습니다.
DLL은 메모리 절약에 도움이 됩니다. 두 개 이상의 응용 프로그램이 동일한 DLL을 사용하는 경우 DLL 페이지를 RAM에 한 번만 넣으면 모든 응용 프로그램이 개별 페이지를 공유할 수 있습니다.
DLL은 리소스 공유를 용이하게 합니다. DLL에는 대화 상자 템플릿, 문자열, 아이콘, 비트맵과 같은 리소스가 포함될 수 있으며 여러 응용 프로그램은 DLL을 사용하여 이러한 리소스를 공유할 수 있습니다.
DLL은 응용 프로그램의 지역화에 도움이 됩니다. 예를 들어, 코드만 포함하고 사용자 인터페이스 구성 요소는 포함하지 않은 응용 프로그램은 지역화된 사용자 인터페이스 구성 요소가 포함된 DLL을 로드할 수 있습니다.
DLL은 플랫폼 차이를 해결하는 데 도움이 됩니다. 다양한 Windows 버전에는 다양한 기능이 탑재되어 있으며 개발자는 종종 새로운 기능을 호출하고 싶어합니다. 그러나 소스 코드에 새 함수에 대한 호출이 포함되어 있고 응용 프로그램이 해당 기능을 제공하지 않는 Windows 버전에서 실행되는 경우 운영 체제의 로더는 프로세스 실행을 거부합니다. 이러한 새 함수가 DLL에 저장되면 응용 프로그램은 이를 이전 버전의 Windows에 로드하고 함수를 성공적으로 호출할 수 있습니다.
2. DLL의 진입점 찾기
DLL을 처음 접하는 사용자는 종종 문제에 직면합니다. VC 환경에서 생성된 DLL은 VC에서 잘 실행되지만 VB 응용 프로그램에서 호출할 때 "호출 규칙 오류" 또는 "찾을 수 없음" 항목이 항상 나타납니다. 포인트' 오류. 이는 주로 다음과 같은 누락으로 인해 발생합니다.
우선, DLL의 함수 선언과 VB의 함수 선언은 이름, 반환 유형, 매개 변수 유형, 매개 변수 수 등이 완전히 동일해야 한다는 점에 유의해야 합니다. 자본화.
둘째, DLL의 .def 파일에 항목 기능을 추가해야 합니다.
마지막으로 함수 정의 앞에 extern "c" 및 _stdcall 키워드를 추가해야 합니다.
구체적인 형식은 적용 예시를 참고하시기 바랍니다.
3. DLL에서 배열 매개변수 전달
DLL은 일부 낮은 수준의 작업을 수행하는 데 사용되는 경우가 많기 때문에 응용 프로그램은 많은 양의 데이터를 DLL에 전달해야 하는 경우가 많습니다. C++에서는 포인터가 배열 작업에 가장 적합하지만 VB에는 포인터 개념이 없습니다. 이는 일반적으로 두 가지 방법으로 해결될 수 있습니다.
먼저, VB에서 DLL을 선언할 때 byval 대신 byref를 사용하여 배열 포인터를 DLL에 전달합니다.
또한 배열을 변형으로 선언하면 배열을 DLL에 직접 전달할 수 있습니다.
4. 적용 사례
다음은 VC 환경에서 생성된 DLL을 VB에서 호출하는 과정을 구체적인 예를 사용하여 설명합니다.
푸리에 계산을 위한 "Fourier" 함수가 포함된 신호 처리용 DLL "SigPro.dll"을 만듭니다.
VC의 진술:
"SigPro.h"에 다음 코드를 추가합니다.
다음과 같이 코드 코드를 복사합니다.
외부 "C"
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
"SigPro.cpp"에 다음 코드를 추가합니다.
외부 "C"
double EXPORT _stdcall 푸리에(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
나는 int;
이중 결과=0.0;
if(SinOrCos==true)
{
for(i=0;i<NumSam;i++)
{
결과=결과+*(샘플+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
또 다른
{
for(i=0;i<NumSam;i++)
{
결과=결과+*(샘플+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
결과 =결과*2/NumSam;
결과 반환;
}
"SigPro.def"에 다음 코드를 추가합니다.
수출
푸리에
VB의 호출 문:
공개 선언 함수 푸리에 Lib "SigPro"(ByRef Sample() As Long, ByVal NumSam As Integer, ByVal OvertoneOrder as Integer, ByVal SinOrCos As Boolean) As Double