โดยทั่วไป มีสามวิธีในการเขียนโปรแกรมร่วมกันระหว่าง VB และ VC: วิธีหนึ่งคือการสร้าง DLL ใน VC และเรียก DLL ใน VB; วิธีหนึ่งคือการสร้างตัวควบคุม ActiveX (.ocx) ใน VC และแทรกลงใน VB; อีกอย่างคือการสร้าง DLL ในเซิร์ฟเวอร์ VC Generate ActiveX Automation ใน VB และเรียกมันใน VB ในทางกลับกัน วิธีแรกมีข้อกำหนดขั้นต่ำสำหรับโปรแกรมเมอร์ VC แต่ต้องอาศัยความร่วมมือจากพันธมิตรของคุณ ฉันขอแนะนำวิธีนี้
มาพูดถึงการเขียนโปรแกรม VC++ ก่อน ขั้นแรกให้สร้างโครงการ Win32 DLL ใน VC++ เพิ่มฟังก์ชันต่างๆ ให้กับโปรเจ็กต์นี้เพื่อให้ผู้ใช้ VB สามารถโทรได้ เพื่อให้ฟังก์ชันใน DLL เรียกใช้โดย VB จะต้องเป็นไปตามเงื่อนไขสองประการ ข้อแรกคือวิธีการเรียกคือ stdcall และอีกวิธีคือต้องส่งออก ในการทำอย่างแรก เพียงเพิ่มคีย์เวิร์ด __stdcall ก่อนการประกาศฟังก์ชัน ชอบ:
ตัวอย่าง __stdcall สั้น (nLen สั้น, * บัฟเฟอร์สั้น)
หากต้องการทำอย่างที่สอง คุณต้องเพิ่มบรรทัดต่อไปนี้ในไฟล์ *.def:
การส่งออก
ตัวอย่าง @1
ตัวอย่างที่นี่คือชื่อของฟังก์ชันที่คุณต้องการเรียกใช้ใน VB @1 แทนจำนวนฟังก์ชันใน DLL และแต่ละฟังก์ชันจะแตกต่างกัน โปรดทราบว่าชื่อฟังก์ชันที่นี่ต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ส่วนความจำเป็นในการถ่ายโอนข้อมูลจำนวนมากก็ทำได้ครับ ใช้อาร์เรย์เก็บข้อมูลใน VB แล้วส่งขนาดและที่อยู่ของอาร์เรย์ไปที่ VC (ส่วนวิธีเขียนโปรแกรมใน VB ผมจะ แนะนำด้านล่าง) เช่นเดียวกับตัวอย่างข้างต้น nLen คือขนาดอาร์เรย์และบัฟเฟอร์คือที่อยู่อาร์เรย์ ด้วยสองรายการนี้ คุณสามารถประมวลผลได้เหมือนกับอาร์เรย์ VC สำหรับกราฟิกเอาท์พุต คุณสามารถสร้างรูปแบบ WMF หรือ BMP แล้วปล่อยให้ VB เรียกมันได้ อย่างไรก็ตาม ฉันคิดว่ามันสามารถส่งออกไปยังหน้าต่างได้โดยตรง ตราบใดที่ VB ผ่านหน้าต่างจัดการ hWnd และ hDC และตำแหน่งการวาดของหน้าต่าง (ระบบพิกัดที่ใช้โดย VB และ VC จะต้องสอดคล้องกัน) ไปยัง VC คุณสมบัติ AutoRedraw ของ VB ต้องเป็นเท็จ และมีการเรียกโปรแกรมวาดรูป VC ในเหตุการณ์ Paint
มาพูดถึงการเขียนโปรแกรม VB กันอีกครั้ง วิธีการเรียก VB เพื่อเรียก DLL นั้นเหมือนกับวิธีการเรียก Windows API ซึ่งโดยทั่วไปจะใช้ในหนังสือ VB สำหรับตัวอย่างข้างต้น ก่อนอื่นให้ประกาศฟังก์ชัน VC:
ประกาศตัวอย่างฟังก์ชัน Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
ที่นี่ mydll.dll คือชื่อของ dll ของคุณ คุณอาจสังเกตเห็นว่าพารามิเตอร์ทั้งสองได้รับการประกาศแตกต่างกัน โดยที่ ByVal ถูกเพิ่มเข้าไปในพารามิเตอร์ตัวแรก กฎคือ: หากมีการประกาศพารามิเตอร์เป็นตัวชี้หรืออาร์เรย์ใน VC ByVal จะไม่ถูกเพิ่ม มิฉะนั้น ByVal จะถูกเพิ่ม การเรียกใช้ฟังก์ชันนี้ใน VB จะใช้ไวยากรณ์ต่อไปนี้:
ตัวอย่างที่ 10, ก(0)
อาร์เรย์ a() ที่นี่ใช้เพื่อเก็บข้อมูล และ 10 คือความยาวของอาร์เรย์ในที่นี้ไม่สามารถเป็น a() ได้ แต่ต้องเป็นพารามิเตอร์ตัวแรกที่จะถูกส่งผ่าน นี่คือกุญแจสำคัญในการเขียนโปรแกรม VB
ด้านล่างนี้เป็นปัญหาที่เป็นไปได้ที่คุณอาจพบ ปัญหาหนึ่งคือ VB อาจรายงานว่าไม่พบ dll คุณสามารถใส่ dll ลงในไดเร็กทอรีระบบและตรวจสอบให้แน่ใจว่าคำสั่ง Declare ของ VB ถูกต้อง ปัญหาอีกประการหนึ่งคือ VB รายงานว่าไม่พบฟังก์ชันที่ต้องการ ซึ่งมักเป็นเพราะไฟล์ *.def ไม่ได้ถูกตั้งค่าใน VC สถานการณ์ที่สามคือ VB บอกคุณว่าไม่สามารถดำเนินการแปลงได้ อาจเป็นเพราะไม่ได้เพิ่มคีย์เวิร์ด __stdcall ใน VC หรืออาจเป็นได้ว่าประเภทพารามิเตอร์ของ VB และ VC ไม่สอดคล้องกัน โปรดทราบว่า int ใน VC คือ 4 ไบต์ (เทียบเท่ากับ VB Long) ในขณะที่จำนวนเต็มของ VB มีเพียง 2 ไบต์ ต้องแน่ใจว่าจำนวนพารามิเตอร์ใน VB และ VC เท่ากัน และจำนวนไบต์ที่ใช้ก็เท่ากันด้วย สิ่งสุดท้ายที่ต้องใส่ใจคืออาร์เรย์ต้องไม่เกินขอบเขตใน VC มิฉะนั้นจะทำให้โปรแกรม VB หยุดทำงาน
1. ข้อดีของการเรียก DLL
เนื่องจากเป็นรากฐานของระบบปฏิบัติการ Windows ไลบรารีลิงก์แบบไดนามิก (DLL) จึงมีประสิทธิภาพแอปพลิเคชันที่เหนือกว่า:
DLLs ขยายคุณสมบัติของแอปพลิเคชัน เนื่องจาก DLL ถูกโหลดแบบไดนามิกลงในพื้นที่ที่อยู่ของกระบวนการ แอปพลิเคชันจึงสามารถกำหนด ณ รันไทม์ว่าการดำเนินการใดที่จำเป็นต้องดำเนินการ จากนั้นจึงโหลดโค้ดที่เหมาะสมเพื่อดำเนินการเหล่านั้นตามความจำเป็น
DLL สามารถเขียนได้หลายภาษา ตัวอย่างเช่น VB ใช้เพื่อเขียนอินเทอร์เฟซของแอปพลิเคชันโปรแกรม และ C++ ใช้เพื่อเขียนการดำเนินการพื้นฐาน เช่น อัลกอริธึมและการสื่อสาร
DLL ช่วยให้การจัดการโครงการซอฟต์แวร์ง่ายขึ้น หากคณะทำงานต่างกันทำงานในโมดูลที่แตกต่างกันในระหว่างการพัฒนาซอฟต์แวร์ โครงการก็จะจัดการได้ง่ายขึ้น
DLL ช่วยประหยัดหน่วยความจำ หากแอปพลิเคชันสองตัวขึ้นไปใช้ DLL เดียวกัน หน้าของ DLL จะต้องใส่ลงใน RAM เพียงครั้งเดียว และแอปพลิเคชันทั้งหมดสามารถแชร์แต่ละหน้าได้
DLL อำนวยความสะดวกในการแบ่งปันทรัพยากร DLL สามารถประกอบด้วยทรัพยากร เช่น เทมเพลตกล่องโต้ตอบ สตริง ไอคอน และบิตแมป และแอปพลิเคชันหลายรายการสามารถใช้ DLL เพื่อแชร์ทรัพยากรเหล่านี้ได้
DLL ช่วยในการแปลแอปพลิเคชัน ตัวอย่างเช่น แอปพลิเคชันที่มีเฉพาะรหัสและไม่มีส่วนประกอบของอินเทอร์เฟซผู้ใช้สามารถโหลด DLL ที่ประกอบด้วยส่วนประกอบของอินเทอร์เฟซผู้ใช้ที่แปลเป็นภาษาท้องถิ่นได้
DLL ช่วยแก้ไขความแตกต่างของแพลตฟอร์ม Windows เวอร์ชันต่างๆ มีฟังก์ชันที่แตกต่างกัน และนักพัฒนามักต้องการเรียกใช้ฟังก์ชันใหม่ อย่างไรก็ตาม หากซอร์สโค้ดมีการเรียกใช้ฟังก์ชันใหม่ และแอปพลิเคชันต้องทำงานบน Windows เวอร์ชันที่ไม่มีฟังก์ชันดังกล่าว ตัวโหลดของระบบปฏิบัติการจะปฏิเสธที่จะเรียกใช้กระบวนการนี้ หากฟังก์ชันใหม่เหล่านี้ถูกบันทึกใน DLL แอปพลิเคชันสามารถโหลดลงใน Windows เวอร์ชันเก่าและเรียกใช้ฟังก์ชันได้สำเร็จ
2. ค้นหาจุดเริ่มต้นของ DLL
ผู้ใช้ที่ติดต่อกับ DLL เป็นครั้งแรกมักประสบปัญหา: DLL ที่สร้างขึ้นในสภาพแวดล้อม VC ทำงานได้ดีใน VC แต่เมื่อเรียกใช้ในแอปพลิเคชัน VB รายการ "ข้อผิดพลาดแบบแผนการเรียก" หรือ "ไม่พบ" จะปรากฏขึ้นเสมอ จุด" ข้อผิดพลาด สาเหตุหลักมาจากการละเว้นดังต่อไปนี้
ประการแรกควรสังเกตว่าการประกาศฟังก์ชันใน DLL และการประกาศฟังก์ชันใน VB จะต้องเหมือนกันทุกประการในแง่ของชื่อ ประเภทการส่งคืน ประเภทพารามิเตอร์ จำนวนพารามิเตอร์ ฯลฯ ให้ความสนใจเป็นพิเศษกับปัญหาของ การใช้อักษรตัวพิมพ์ใหญ่
ประการที่สอง ต้องเพิ่มฟังก์ชันรายการลงในไฟล์ .def ของ DLL
สุดท้ายนี้ ต้องเพิ่มคีย์เวิร์ด extern "c" และ _stdcall ก่อนคำจำกัดความของฟังก์ชัน
โปรดดูตัวอย่างการใช้งานสำหรับรูปแบบเฉพาะ
3. การส่งผ่านพารามิเตอร์อาร์เรย์ใน DLL
เนื่องจาก DLL มักจะถูกใช้เพื่อดำเนินการในระดับต่ำ แอปพลิเคชันจึงมักจะต้องส่งข้อมูลจำนวนมากไปยัง DLL ใน C++ พอยน์เตอร์เป็นตัวเลือกที่ดีที่สุดสำหรับการดำเนินการกับอาร์เรย์ แต่ไม่มีแนวคิดเกี่ยวกับพอยน์เตอร์ใน VB โดยปกติสามารถแก้ไขได้สองวิธี
ขั้นแรก เมื่อประกาศ DLL ใน VB ให้ใช้ byref แทน byval เพื่อส่งผ่านตัวชี้อาร์เรย์ไปยัง DLL
นอกจากนี้ การประกาศอาร์เรย์เป็นตัวแปร คุณสามารถส่งผ่านอาร์เรย์ไปยัง DLL ได้โดยตรง
4. ตัวอย่างการใช้งาน
ต่อไปนี้ใช้ตัวอย่างเฉพาะเพื่อแสดงกระบวนการเรียก DLL ที่สร้างขึ้นในสภาพแวดล้อม VC ใน VB
สร้าง DLL สำหรับการประมวลผลสัญญาณ "SigPro.dll" ซึ่งมีฟังก์ชัน "ฟูริเยร์" สำหรับการคำนวณฟูริเยร์
คำชี้แจงใน VC:
เพิ่มรหัสต่อไปนี้ใน "SigPro.h"
คัดลอกรหัสรหัสดังต่อไปนี้:
ภายนอก "C"
-
ส่งออกสองครั้ง _stdcall ฟูริเยร์ (int ยาว * ตัวอย่าง, int NumSam, int OvertoneOrder, บูล SinOrCos);
-
เพิ่มรหัสต่อไปนี้ใน "SigPro.cpp"
ภายนอก "C"
ส่งออกสองครั้ง _stdcall ฟูริเยร์ (ยาว int * ตัวอย่าง, int NumSam, int OvertoneOrder, บูล SinOrCos)
-
ฉัน;
ผลลัพธ์สองเท่า=0.0;
ถ้า(SinOrCos==จริง)
-
สำหรับ(i=0;i<NumSam;i++)
-
result=result+*(ตัวอย่าง+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
-
-
อื่น
-
สำหรับ(i=0;i<NumSam;i++)
-
result=result+*(ตัวอย่าง+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
-
-
result =result*2/NumSam;
ส่งคืนผลลัพธ์;
-
เพิ่มรหัสต่อไปนี้ใน "SigPro.def"
การส่งออก
ฟูริเยร์
คำสั่งการโทรใน VB:
ฟังก์ชั่นประกาศสาธารณะฟูริเยร์ Lib "SigPro" (ตัวอย่าง ByRef () ตราบใดที่ ByVal NumSam เป็นจำนวนเต็ม, ByVal OvertoneOrder เป็นจำนวนเต็ม, ByVal SinOrCos เป็นบูลีน) เป็นสองเท่า