C++封住Dll中的一个方法 :char* checkCardReaderValid (int iPort); 返回值是指针请问在C# 如何接收这个返回值托管和非托管之间如何传送 我是这样写的
[DllImport("idcarddll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr)]
static extern IntPtr checkCardReaderValid(int iPort);
//功能:检查读卡器是否可以正常工作。
//启动读卡
private void button7_Click(object sender, EventArgs e)
{
IntPtr lpByte =checkCardReaderValid(0);
if (lpByte != IntPtr.Zero)
{
string result = Marshal.PtrToStringAnsi(lpByte);
}
else
{
throw new Exception("返回字符串为空");
}
}
报错如下:无法封送处理“return value”: 无效的托管/非托管类型组合
[DllImport("idcarddll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr)]
static extern IntPtr checkCardReaderValid(int iPort);
//功能:检查读卡器是否可以正常工作。
//启动读卡
private void button7_Click(object sender, EventArgs e)
{
IntPtr lpByte =checkCardReaderValid(0);
if (lpByte != IntPtr.Zero)
{
string result = Marshal.PtrToStringAnsi(lpByte);
}
else
{
throw new Exception("返回字符串为空");
}
}
报错如下:无法封送处理“return value”: 无效的托管/非托管类型组合
解决方案 »
- petshop4.0中的消息处理问题
- 急问 句柄未初始化
- 引用Microsoft.DirectX.AudioVideoPlayback 实现播放视频文件时出现问题。请高手解决。谢谢先
- C#2005,flash8b.ocx组件如何播放flash?
- 关于Null Object模式
- 给为C#前辈,小弟菜鸟,问一个简单的问题,不要笑~~
- xml
- web form 中在datagrid的edititem中cells的值该如何保存?在什么事件中触发保存呢?
- 各位高手,帮我看一下这是什么问题?
- C#使用OLE操作DBF文件,插入datetime类型的值,在获取的时候只剩日期部分,时间部分变成了0
- 关于 override WndProc 的小问题
- 读取数据库
//去掉试试;
Marshal.Copy(IntPtr source,
char[] destination,
int startIndex,
int length
) 复制
想问一下,c#里好像可以直接调用unmanaged code啊..你为什么要使用marshal呢?
为什么不直接调用c++的代码呢?我用过几次marshal,但只在访问com对象的时候用的.其它的情况我不太清楚..
我做了一个试验:
//c++ code; dll functions;
#include <stdio.h>
#include "string.h"extern "C" __declspec(dllexport)
char* TestFunc(int i)
{
char * retValue= new char[100];
switch (i)
{
case 0:
strcpy(retValue,"you have inputed 0"); break;
case 1:
strcpy(retValue,"you have inputed 1"); break;
case 2:
strcpy(retValue,"you have inputed 2"); break;
default: break;
}
return retValue;
}//c# code; consumer;
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;namespace CSharpConsumer
{
class Program
{
[DllImport("testLib.dll", EntryPoint = "TestFunc", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl,
SetLastError = true)]
static extern string TestFunc(int index); static void Main(string[] args)
{
Console.WriteLine(TestFunc(1));
}
}
}
==================================
运行结果:you have inputed 1
HANDLE void* IntPtr
BYTE unsigned char Byte
SHORT short Int16
WORD unsigned short UInt16
INT, LONG int, long Int32
BOOL int, long Int32 or Boolean
UINT unsigned int UInt32
DWORD, ULONG unsigned long UInt32
CHAR char Char
LPSTR, LPCSTR, LPWSTR, LPCWSTR char*, wchar_t* String or StringBuilder
FLOAT float Single
DOUBLE double Double
别轻易用marshel,CLR能做的,就让CLR帮你做...
你运行我的例子了吗?
为什么我的代码能返回值?你的c++代码有问题吗?你用C++调你的函数,看看返回值是不是为空总结一下: 1.在c++里验证你的export的函数能否正常工作;
2.不需要自己marshal,所以你的代码要改一改.我的sample code可以正常工作
委托就是相当于指针吗 。。可以去搜搜相关例子