/* 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());
}
本文提供了一个C语言中函数作为参数传递的例子,并展示了如何在C#中调用C编译的DLL,包括设置回调函数进行通信。示例中包含C语言的函数声明、定义以及C#的委托定义、DLLImport声明和回调函数实现。
219

被折叠的 条评论
为什么被折叠?



