Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1705930
  • 博文数量: 171
  • 博客积分: 11553
  • 博客等级: 上将
  • 技术积分: 3986
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-25 20:28
文章分类

全部博文(171)

文章存档

2012年(2)

2011年(70)

2010年(9)

2009年(14)

2008年(76)

分类: C/C++

2008-03-22 16:01:06

文件: cplusplus.rar
大小: 10KB
下载: 下载
创建DLL工程cplusplus.dll,共有三个文件cplusplus.h,cplusplus.c和cplusplus.def
cplusplus.h文件内容:
 

#ifndef __CPLUSPLUS_H__
#define __CPLUSPLUS_H__
/************************************************************************/
/*
*注意错误R6034!!!
*Visual C++ Libraries as Shared Side-by-Side Assemblies
*/

/************************************************************************/
#define MAX_LEN 20
typedef enum ECODE
{
    E_OK,
    E_FAILED
}ECODE;

#ifdef __cplusplus
extern "C"
{
#endif

int Add(int i,int j);
ECODE GetText(char* szText,int* pnLen);
ECODE SetText(char* szText,int nLen);
ECODE GetBinData(char* pData,int* pnLen);

#ifdef __cplusplus
}
#endif

#endif

cplusplus.c文件内容

 

// cplusplus.cpp : Defines the entry point for the DLL application.

//


#include "cplusplus.h"
#include <windows.h>
//#ifdef _MANAGED

//#pragma managed(push, off)

//#endif



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
//文本数据结果

typedef struct CData{
    char m_szText[MAX_LEN];
    int m_nLen;
}CData;
CData g_csData;
//二进制数据结构

typedef struct CBinData
{
    int nNum;
    int nAge;
    short nHeight;
}CBinData;
/************************************************************************/
/*
*功能    
*    加法运算
*参数
*    i    in    加数
*    j    in    被加数
*返回值
*    两数之和
*/

/************************************************************************/
int Add(int i,int j)
{
    return i + j;
}
#include <stdio.h>
/************************************************************************/
/*
*功能
*    取出组件中当前的文本及文本长度值
*参数
*    szText    out    保存文本的缓冲区
*    pnLen    out    保存文本长度的地址
*            in    szText缓冲区的最大长度    
*返回值
*    E_OK        调用成功
*    E_FAILED    调用失败
*/

/************************************************************************/
ECODE GetText(char* szText,int* pnLen)
{
    char szTemp[MAX_LEN*2] = {0};
    if ( *pnLen > g_csData.m_nLen)
    {
        return E_FAILED;
    }
    sprintf(szTemp,"GetText %s = %d\n",szText,*pnLen);
    printf(szTemp);
    memcpy(szText,g_csData.m_szText,g_csData.m_nLen);
    *pnLen = g_csData.m_nLen;
    return E_OK;
}
/************************************************************************/
/*
*功能
*    设置组件中当前的文本内容及长度
*参数
*    szText    in    文本缓冲区
*    nLen    in    文本长度
*返回值
*    E_OK        调用成功
*    E_FAILED    调用失败
*/

/************************************************************************/
ECODE SetText(char* szText,int nLen)
{
    if ( nLen > 0 && nLen < MAX_LEN)
    {
        char szTemp[MAX_LEN*2] = {0};
        memcpy(g_csData.m_szText,szText,nLen);
        g_csData.m_nLen = nLen;
        sprintf(szTemp,"SetText %s = %d\n",szText,nLen);
        printf(szTemp);
        return E_OK;
    }

    return E_FAILED;
}
/************************************************************************/
/*
*功能
*    获取组件中二进制数据
*参数
*    pData    in    保存二进制数据的地址
*    pnLen    in    二进制缓冲区地址
*返回值
*    E_OK        调用成功
*    E_FAILED    调用失败
*/

/************************************************************************/
ECODE GetBinData(char* pData,int* pnLen)
{
    CBinData g_bdData;
    if ( *pnLen < sizeof(CBinData))
    {
        return E_FAILED;
    }
    g_bdData.nNum = 123456L;
    g_bdData.nAge = 789L;
    g_bdData.nHeight = 654321L;
    
    memcpy(pData,&g_bdData,sizeof(CBinData));
    *pnLen = sizeof(CBinData);
    printf("*pnLen = %d\n",*pnLen);
    return E_OK;
}

cplusplus.def文件内容

EXPORTS

    Add
    GetText
    SetText
    GetBinData

C#调用dll
创建C#工程CallCpp.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

public class CPlusPlus
{
    [DllImport("cplusplus.dll")]
    public static extern ECODE Add(int i, int j);
    [DllImport("cplusplus.dll")]
    public static extern ECODE GetText([MarshalAs(UnmanagedType.LPStr)] StringBuilder szText, [MarshalAs(UnmanagedType.I4)] ref int pnLen);
    [DllImport("cplusplus.dll")]
    public static extern ECODE SetText([MarshalAs(UnmanagedType.LPStr)] StringBuilder szText, int pnLen);
    [DllImport("cplusplus.dll")]
    public static extern ECODE GetBinData([MarshalAs(UnmanagedType.LPStr)] StringBuilder pData, [MarshalAs(UnmanagedType.I4)] ref int pnLen);

    public enum ECODE { E_OK, E_FAILED };
    public uint MAX_LEN = 20;
};
namespace CallCPP
{
    class CallCpp
    {
        static void Main(string[] args)
        {
            CPlusPlus.ECODE Error = CPlusPlus.ECODE.E_OK;

            System.Console.WriteLine(CPlusPlus.Add(20, 30));
            StringBuilder sbText = new StringBuilder("Hello cplusplus", 20);
            Error = CPlusPlus.SetText(sbText, sbText.Length);
            if (Error != CPlusPlus.ECODE.E_OK)
            {
                System.Console.WriteLine("CPlusPlus.SetText error");
                return;
            }
            StringBuilder sbGet = new StringBuilder(256);
            int nLen = 10;
            Error = CPlusPlus.GetText(sbGet, ref nLen);
            if (Error != CPlusPlus.ECODE.E_OK)
            {
                System.Console.WriteLine("CPlusPlus.GetText error");
                return;
            }
            System.Console.WriteLine("strlen({0}) = {1}", sbGet.ToString(), nLen);
            StringBuilder sbBin = new StringBuilder(20);
            Error = CPlusPlus.GetBinData(sbBin, ref nLen);
            if (Error != CPlusPlus.ECODE.E_OK)
            {
                System.Console.WriteLine("CPlusPlus.GetBinData error");
                return;
            }
        }
    }
}

CPP调用DLL,创建CallCpp.cpp工程
文件: CppCallCpp.rar
大小: 2KB
下载: 下载

// CppCallCpp.cpp : Defines the entry point for the console application.

//


#include "stdafx.h"
#include "cplusplus.h"
#include <string.h>

int _tmain(int argc, _TCHAR* argv[])
{
    printf("%d\n",Add(20,30));
    ECODE Error = SetText("Hello cplusplus",strlen("Hello cplusplus"));
    if ( Error != E_OK)
    {
        printf("SetText error.\n");
        return -1;
    }
    char pszGet[256] = {0};
    int nLen = 10;
    Error = GetText(pszGet,&nLen);
    if( Error != E_OK )
    {
        printf("GetText error.\n");
        return -1;
    }
    printf("strlen(%s) = %d\n",pszGet,strlen(pszGet));

    char pBinData[200];
    nLen = 200;
    Error = GetBinData(pBinData,&nLen);
    if ( Error != E_OK )
    {
        printf("GetBinData error.\n");
        return 0;
    }
    return 0;
}

 

文件: CallCPP_CS.rar
大小: 2KB
下载: 下载

 

阅读(6347) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-18 18:12:25

3Q..最近正想找这种用C写的DLL在C#中调用的实例.....帮了大忙了.... [MarshalAs(UnmanagedType.LPStr)]这种类似的对指针的处理对其它类型的指针通用么???