VB에서 VC로 작성된 DLL을 호출하는 방법 공유

4868 단어 VBVCDLL
일반적으로 VB와 VC의 공동 프로그래밍은 세 가지 방식이 있다. 하나는 VC가 DLL을 생성하고 VB에서 DLL을 호출하는 것이다.하나는 VC가 VB에 삽입하는 ActiveX 컨트롤(.ocx)을 생성하는 것입니다.또 하나는 VC에서 ActiveX Automation 서버를 생성하여 VB에서 호출하는 것입니다.상대적으로 첫 번째 방법은 VC 프로그래머에 대한 요구가 가장 낮지만 당신의 파트너에게 협조를 요구합니다. 저는 이런 방법을 추천합니다.먼저 VC++의 프로그래밍을 말해 보세요.먼저 VC++에서 Win32 DLL 프로젝트를 생성합니다.이 프로젝트에 VB 사용자가 호출할 수 있도록 몇 개의 함수를 추가합니다.하나의 DLL의 함수가 VB에 호출되려면 두 가지 조건을 만족시켜야 한다. 하나는 호출 방식이 stdcall이고 다른 하나는 export이어야 한다.첫 번째 항목을 수행하려면 함수 선언 전에 __ 를 추가해야 합니다.stdcall 키워드.예: short __stdcall sample(short nLen, short *buffer) 두 번째 조항을 하려면 *.def 파일에 다음과 같은 행을 추가합니다.
EXPORTS sample @1 여기 있는 Sample은 VB에서 호출할 함수 이름입니다. @1은 이 함수가 DLL에 있는 번호를 표시합니다. 함수마다 다릅니다.여기 함수 이름은 대소문자를 구분합니다.당신이 말한 대량의 데이터를 전달해야 한다는 것은 이렇게 할 수 있다. VB에서 하나의 수조로 데이터를 저장한 다음에 이 수조의 크기와 주소를 VC에 전달할 수 있다. (VB에서 프로그래밍하는 방법은 아래에서 소개할 것이다.)위의 예와 같이 nLen은 수조 크기이고 버퍼는 수조 주소입니다. 이 두 가지가 있으면 VC를 사용하는 수조처럼 처리할 수 있습니다.도면을 내보내는 경우 WMF 또는 BMP 형식을 생성하여 VB를 호출할 수 있습니다.그러나 나는 VB가 창의 핸들 hWnd와 hDC, 그리고 창의 그림 위치 (VB와 VC가 사용하는 좌표계가 일치해야 한다) 를 VC에 전달하면 된다고 생각한다.VB의 AutoRedraw 속성은 Paint 이벤트에서 VC의 드로잉 프로그램을 호출하는 False이어야 합니다.VB의 프로그래밍에 대해 다시 이야기하자.VB에서 DLL을 호출하는 방법과 Windows API를 호출하는 방법은 동일합니다. 일반적으로 VB의 책에 소개되어 있습니다.위의 예에서 먼저 VC 함수를 설명해야 한다. Declare Function sample Lib "mydll.dll"(ByVal nLen As Integer, buffer As Integer) As Integer 여기 mydll.dll은 당신의 dll 이름입니다.너는 두 개의 매개 변수의 성명이 다르다는 것을 이미 알아차렸을 것이다. 첫 번째 매개 변수에 ByVal이 추가되었다.규칙은 다음과 같습니다. VC에서 매개 변수가 포인터와 수조로 표시되면 ByVal을 추가하지 않습니다. 그렇지 않으면 ByVal을 추가해야 합니다.VB에서 이 함수를 호출하면 다음과 같은 문법을 사용합니다. sample 10, a(0) 여기 a() 수조는 데이터를 저장하는 데 사용되고 10은 수조의 길이입니다. 여기 두 번째 매개 변수는 a()가 아니라 전달해야 하는 데이터 중 첫 번째입니다.이것은 VB 프로그래밍의 관건이다.다음은 몇 가지 직면할 수 있는 문제를 이야기하고 있다.문제는 VB가 dll을 찾지 못할 수도 있다는 것입니다. 시스템 디렉터리에 dll을 놓고 VB의 Declare 문장이 정확한지 확인하십시오.또 다른 문제는 VB 보고서에서 필요한 함수를 찾을 수 없다는 것이다. 이것은 보통 VC에 있기 때문이다. *.def 파일이 설정되지 않았습니다.세 번째는 VB가 변환할 수 없음을 알려준다는 것입니다. 이것은 VC에 __를 추가하지 않은 것일 수 있습니다.stdcall 키워드는 VB와 VC의 매개 변수 형식이 일치하지 않을 수도 있습니다. VC에서 int는 4바이트(VB의 Long에 해당)이고 VB의 Integer는 2바이트입니다.VB와 VC의 매개 변수 개수가 같고 바이트 개수도 일치해야 합니다.마지막으로 주의해야 할 문제는 VC에서 절대로 수조가 경계를 넘는 상황이 나타나서는 안 된다는 것이다. 그렇지 않으면 VB 프로그램이 붕괴될 수 있다.DLL 호출 우수성
동적 링크 라이브러리(DLL)는 Windows 운영체제의 기초로서 우수한 응용 성능을 가지고 있다. 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에 전달할 수 있다.또한 그룹을 변형(variant)으로 선언하면 DLL에 직접 그룹을 전달할 수 있습니다.
4. 인스턴스 적용
다음은 VB에서 VC 환경에서 생성된 DLL을 호출하는 프로세스를 구체적으로 설명합니다.신호 처리에 사용되는 DLL, "SigPro.dll"을 만듭니다. 이 중 하나는 Fourier 계산에 사용되는 함수입니다.
VC의 선언:
SigPro.h에 다음 코드를 추가합니다

extern "C"
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
"SigPro.cpp" ,
extern "C"
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
int i;
double result=0.0;

if(SinOrCos==true)
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
else
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
result =result*2/NumSam;
return result;
}

"SigPro.def"에 다음 코드를 추가합니다. EXPORTS Fourier
VB의 호출 설명: Public Declare Function Fourier Lib'SigPro'(ByRef Sample) As Long, ByVal NumSam As Integer, ByVal OvertoneOrder As Integer, ByVal SinOrCos As Boolean) As Double

좋은 웹페이지 즐겨찾기