c 函数作形参 的例子, C#调用

来源:互联网 发布:淘宝床上用品货源 编辑:程序博客网 时间:2024/05/17 12:01


/* Type for main function. */
typedef int (*pj_main_func_ptr)(int argc, char *argv[]);


作为形参数

int pj_run_app(pj_main_func_ptr main_func, int argc, char *argv[],
      unsigned flags);


static int main_func(int argc, char *argv[])
{
    setup_socket_signal();


    do {
app_restart = PJ_FALSE;


if (app_init(argc, argv) != PJ_SUCCESS)
   return 1;


setup_signal_handler();


app_main();
app_destroy();


/* This is on purpose */
app_destroy();
    } while (app_restart);


    return 0;
}

//传实参数

int main(int argc, char *argv[])

    return pj_run_app(&main_func, argc, argv, 0);
}

 

========================================================================================================

//header files

typedef void (* itemnotify)(int itemno,int value);

itemnotify m_itemnotify;

#ifdef __cplusplus
extern "C" {
#endif

 #define _EXPORT_IMPORT_SERIALCOMM_ __declspec(dllexport)


 _EXPORT_IMPORT_SERIALCOMM_ int Add(int a ,int b );

 _EXPORT_IMPORT_SERIALCOMM_ void SetNotifyCallback( itemnotify notify );

 _EXPORT_IMPORT_SERIALCOMM_ void Start(  );

 

}

 

 

 

// 这是主 DLL 文件。

#include "stdafx.h"

#include "ExportTest.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif


BOOL APIENTRY DllMain( HMODULE hModule,
       DWORD  ul_reason_for_call,
       LPVOID lpReserved
       )
{
 return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

int Add(int a ,int b )
{
 return a+b;
}

void Start()
{
 if (m_itemnotify==NULL)
  return ;

 int num=100;
 while (num>0)
 {
  int item_value= rand() ;
  m_itemnotify(num,item_value);
  Sleep(20);
  num--;
 }
}

void SetNotifyCallback( itemnotify lpnotify  )
{
 m_itemnotify=lpnotify;
}

 

// C# 委托函数定义

[DllImport("ExportTest.dll")]
        public static extern int Add(int a, int b);
       
        [DllImport("ExportTest.dll")]
        public static extern void SetNotifyCallback(NotifyCallback lpNotifyCallback);

        [DllImport("ExportTest.dll")]
        public static extern void Start();

       

        unsafe public delegate void NotifyCallback(int itemNo, int itemValue);

        NotifyCallback m_NotifyCallback;

      private void button2_Click(object sender, EventArgs e)
        {
            m_NotifyCallback = new NotifyCallback(Notify);
            SetNotifyCallback(m_NotifyCallback);
            Start();
        }

        private void Notify(int itemNo, int itemValue)
        {
            ListViewItem item=listView1.Items.Add(itemNo.ToString());
            item.SubItems.Add(itemValue.ToString());

        }