วันพฤหัสบดีที่ 21 มิถุนายน พ.ศ. 2555

การนำ C# มาใช้งาน กับ Ruby C/C++ ภาคที่ 2 ติดต่อกับRuby


-Thanaphan In.
ในบทที่แล้ว ได้แนะนำการใช้งานที่ ให้สร้าง C# เป็น Com Interface สำหรับให้ โปรแกรม อื่นใน window สามารถ ติดต่อกันได้ ได้ สำหรับ การใช้งาน กับ ภาษา Ruby ไม่ว่าจะเป็น  Sketchup หรือ Ruby on Rail ก็สามารถใช้งานได้ 2 ทาง คือ ผ่าน Interface ของ C/C++ หรือ ผ่าน “win32ole” สำหรับ win32ole มีตัวอย่างบน Internet พอสมควรแล้ว(ค้นใน Google “ruby win32ole”) สำหรับ การใช้ C/C++ มีขอที่ดีคือสามารถใช้ Debuger ของ Visual Studio ดูระหว่างทำงานได้ เพื่อสะดวกการสร้าง เป็น Class Interface ระหว่าง C++ กับ C# การเขียนโปรแกรมจะได้ ใช้ Visual Studio เป็นส่วนใหญ่

ไปที่ตัวอย่างที่สร้าง Dialog บน MFC สร้างปุ่มกด
Add C#  และมี EditBox  ตามรูป


สำหรับหัวไฟล์ ให้ใส่เพิ่ม #import

#include "stdafx.h"
#include "winsock.h"
#include "ruby.h"
#include "rbMfc1.h"
#include "rbDlgMFC1.h"
#include "rubyutils.h"

#import "Mathlib.tlb" raw_interfaces_only




ที่ EditBox add Variable ด้วยกดเมาวส์ขวา ชื่อ c_Edit1
สร้างคำสั่งสำหรับปุ่มแรก

void CtestCallManageDlg::OnBnClickedButton1()
{
      // TODO: Add your control notification handler code here
    HRESULT hr= CoInitialize(NULL); // เริ่ม Interface
MathLib::IAddClassPtr pIAddClass(__uuidof(CAddClass));//คลาสใน C#
        long result=0;
        hr=pIAddClass->Add(10,20,&result);//Function ใน Interface C#
       
        CoUninitialize();// จบ Interface
        CString outt;
        outt.Format(_T("%d"),result);
        this->c_Edit1.SetWindowTextW(outt);
}



สำหรับ Form ให้ สร้างอีกปุ่ม (การสร้างให้กด double Click ที่ปุ่ม)
void CtestCallManageDlg::OnBnClickedButton2()
{
      // TODO: Add your control notification handler code here
 HRESULT hr= CoInitialize(NULL);

 MathLib::IForm1Ptr pIForm(__uuidof(CiForm1));
        long result=0;
         hr= pIForm->aForm(&result);//Function ในการเรียก Form
        CoUninitialize();
        CString outt;
     
        outt.Format(_T("%d"),result);
       // this->c_Edit1.SetWindowTextW(outt);

}


จากนั้น Build และทำการ Copy Mathlib.dll ไปที่ google..\plugins ไม่นั้นจะทำงานไม่ได้




วันอังคารที่ 19 มิถุนายน พ.ศ. 2555

สร้าง Application บน Sketchup ด้วย C# ภาคที่1 C# COM

ในบทก่อนหน้านี้ ผมได้แนะนำการใช้ MFC C/C++ ในการสร้าง Application บน Ruby Sketchup แต่สำหรับคนเขียนโปรแกรมเมื่อเทียบกับ C# แล้ว ก็ถือว่า ยัง ยากอยู่มาก ในปัจจุบัน โปรแกรม ที่เขียนบน Dotnet C# มีจำนวนมาก และ มี Class สำเร็จรูป ดีๆ เช่น ฐานข้อมูล การเชื่อมกับ Office Excel หรือ Internet เป็นต้้น และ มีตัวอย่าง C# เช่นใน Codeproject.com ทำให้การสร้าง Application ซับซ้อนสูง ทำได้ อย่างรวดเร็ว โดยเฉพาะการทำ Dialog หรือ Form C# เขียนง่ายมาก เมืื่อเทียบกับ Ruby หรือ MFC C/C++
สำหรับ Sketchup มี Ruby เป็นภาษาในการพัฒนาโปรแกรมเสริม และเราสามารถใช้ C/C++ ในการพัฒนาเชื่อมต่อ ได้ในบทความก่อนหน้านี้ สำหรับ C# มีสถานะที่ต่างกัน เนื่องจาก C# เป็น Manage Code การที่ C/C++ จะเรียก Manage Code ซึ่งเป็น Subset ที่ใหญ่กว่า จะยากกว่า ที่ Managed Code C# เรียก Unmanaged C/C++ มาก   Microsoft ได้เปิดช่องใว้ทางเดียว คือต้องทำให้ Managed Code C# เป็น COM หรือ Component Object Model อันเป็นระบบเก่าแก่ของ Microsoftในการเชื่อม ระหว่างโปรแกรมด้วยกัน
ถ้าดูจากวิธีที่จะใช้ C# เข้าไปใน Sketchup นั้น จะเป็นไปตาม Diagram นี้

[Ruby] <----- C/C++ ----> [MFC C/C++] <----- COM----->[C# DotNet]


เร่ิมต้น เราสร้าง Project สำหรับ C# Class ก่อน โดยเปิด Visual Studio 2008 หรือ 2010
และสร้าง Class ตามตัวอย่าง จะเห็นได้ว่า มี Interface เป็นการตั้ง Type สำหรับการติดต่อ กับโปรแกรม
อื่น ตัวอย่างนี้ มี 2  Interface เป็นตัวอย่าง คำนวน บวกค่า และ ตัวอย่างในการแสดง Dialog


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MathLib
{
    public interface IAddClass
    {
        int Add(int a, int b);
    }
    public class CAddClass : IAddClass
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
       

        public interface IForm1
        {
            int aForm();
        }

        public class CiForm1 : IForm1
        {

            public int aForm()
            {
               
                if (MessageBox.Show("HELLO") == DialogResult.OK)
                {
                    return 1;
                }
                return 0;
            }

        }
    }
}


ก่อนที่จะ Compile ให้สร้าง Stong Name เพื่อให้โปรแกรม Dll ที่ Compile นี้ เป็น Unique
สำหรับโปรแกรมอื่น ไปที่ Visual Studio ->Utitliy->Command Prompt

sn -k myClass.SNK 

ทำการ Copy  SNK นี้ ไปที่ โครงการที่กำลังทำอยู่ จากนั้น Add เข้าไปใน Project 
และ สำหรับการ Build   การ Compile ให้ตั้งค่าที่ Post Build  ใน Build Event

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regAsm.exe <ชื่อโปรแกรม>.dll /tlb:MathLib.tlb /codebase



จะสร้าง tlb สำหรับให้ C/C++ รู้จัก
สำหรับ ใน โครงการ ให้แก้ AssemblyInfo.cs


[assembly: ComVisible(true)]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("myClass.SNK")]

จากนั้น ให้ ทำการ Compile โปรแกรม จะได้ Dll พร้อมกับ Tlb สำหร้บ ทำการ Include ใน C/C++ ต่อไป เป็นอันสิ้นสุดการทำ COM ให้ C# ชุดนี้