Dll中的函数定义如下
extern "C" _API int __stdcall Block (short *block);
我该怎么声明这个函数?这么声明可以么?
[DllImport("_API.dll")]
public unsafe static extern int Block(short * block);如果声明这样的不安全代码,c#中该如何使用呢
extern "C" _API int __stdcall Block (short *block);
我该怎么声明这个函数?这么声明可以么?
[DllImport("_API.dll")]
public unsafe static extern int Block(short * block);如果声明这样的不安全代码,c#中该如何使用呢
解决方案 »
- 急急急急,怎么控制datalist内部的控件显示与隐藏。
- 窗体 异常来自 HRESULT:0x800A03EC
- 求年月正则表达式
- csc 的 /unsafe 到底做了什么?
- 亲爱的csdn网友.大家没有人做过cmpp3.0开发.能不能交流一下经验,
- treeView 有没有什么属性能使所有的节点都打开
- DataGridView无论我输入什么,最后一个数怎么得到的总是0?问题很严重了!
- winfrom和web页面开关闭的问题
- 在一些帖子中经常看到r3、r4是什么?
- winform设计器打不开,提示“尚未初始化设计器加载程序”
- C#中如何弹出提示确认信息框?或者说,如何在C#类中接受提示确认信息框的返回值?
- 实现手机短信提醒功能..
public static extern int Block(short[] block);
这样就行了,
short[] block=new short[1];
block[0]=123;
Block(block);
public static extern int Block(short[] block);
用指针参是为了传出参数。
就算加了一个out ,而我根本无法保证传出数组的长度(不固定),产生错误的可能性会很大!
static extern unsafe FT_STATUS FT_ListDevices(void* pvArg1, void* pvArg2, UInt32 dwFlags); // FT_ListDevices by number only
[DllImport("FTD2XX.dll")]
static extern unsafe FT_STATUS FT_ListDevices(UInt32 pvArg1, void* pvArg2, UInt32 dwFlags); private unsafe bool ListUnopenDevices()
{
FT_STATUS ftStatus = FT_STATUS.FT_OTHER_ERROR;
UInt32 numDevs;
int i;
byte[] sDevName = new byte[64];
int iCurrentIndex;
void* p1; itemlist.Clear(); p1 = (void*)&numDevs;
ftStatus = FT_ListDevices(p1, null, FT_LIST_NUMBER_ONLY); if (ftStatus == FT_STATUS.FT_OK)
{
if (dwListDescFlags == FT_LIST_ALL)
{
for (i = 0; i < numDevs; i++)
{
itemlist.Add(i);
}
}
else
{
for (i = 0; i < numDevs; i++)
{
fixed (byte* pBuf = sDevName)
{
ftStatus = FT_ListDevices((UInt32)i, pBuf, dwListDescFlags);
if (ftStatus == FT_STATUS.FT_OK)
{
string str;
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
str = enc.GetString(sDevName, 0, sDevName.Length);
itemlist.Add(str);
}
else
{
// MessageBox.Show("Error list devices" + Convert.ToString(ftStatus), "Error");
return false;
}
}
}
}
} return true;
}
void Test(HWND hwnd,CDC *pDC);C#
[DllImport("TestDll.dll", EntryPoint = "Test")]
public static extern void Test(IntPtr hwnd,IntPtr pDC);
调用:
IntPtr hDestopDc = GetWindowDC((IntPtr)0);// GetWindowDC自己声明
InitTypeSet(this.Handle, hDestopDc);字符串:C++
void Test2(LPCTSTR lpFileName);C#[DllImport("TestDll.dll", EntryPoint = "Test2")]
public static extern void Test2([MarshalAs(UnmanagedType.LPTStr)] string lpFilePath);
object是所有类的基类,而且是按引用传递,很像void*这个指针。
这样就可以避免了unsafe代码,不知能行得通么
/// 按块读取冲击采集数据,须上传后有效
/// </summary>
/// <param name="impblock">数组,传出采集的数据用</param>
/// <returns>返回数据块长度</returns>
[DllImport("dsad.dll")]
private static extern int ImpGetBlock([MarshalAs(UnmanagedType.LPArray)] short [] block); public static short[] DllImpGetBlock(int blockLen)
{
short [] outBlock = new short [blockLen];
//blockLen 长度不够就会产生错误,预分配的内存要足够大,这个是个问题
int len = ImpGetBlock(outBlock);
return outBlock;
}
TO :15楼,object传参可以,应用时转换会出错