UINT16错误 [英] UINT16 error

查看:269
本文介绍了UINT16错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建托管的c ++包装器并且在运行SetNewNetworkCallBack时遇到问题是

。它不喜欢NetworkID不是一个

UInt16。我收到错误:


CCommManager :: SetNewNetworkCallBack'':无法将参数1从''void

(unsigned short,void *)''转换为''void(__ cdecl *)(UInt16,void *)''


任何帮助都会被贬低。恶意代码如下。


James

托管代码:


CCommApp :: CCommApp(char chan,long baud,String * ServerAddress,int

ListenPort,bool Logging)

{

m_pComm-> SetNewNetworkCallBack(NewNetwork,this); //问题

line

}


void CCommApp :: NewNetwork(unsigned short NetworkID,void * Parameter)


非托管代码标题:


void SetNewNetworkCallBack(void(* NewNetworkCallBack)(UI nt16 NetworkID,void *

参数) ,void *参数);

解决方案

On Tue,2005年9月20日11:04:33 -0400,James Crouch

< ja ********** @ wpafb.af.mil>写道:

我正在尝试创建一个托管的c ++包装器,并在运行SetNewNetworkCallBack时遇到问题。它不喜欢NetworkID不是UInt16。我收到错误:CCommManager :: SetNewNetworkCallBack'':无法将参数1从''void
(unsigned short,void *)''转换为''void(__ cdecl *)( UInt16,void *)''

任何帮助都会被贬低。恶意代码如下。

James

托管代码:

CCommApp :: CCommApp(char chan,long baud,String * ServerAddress,int
ListenPort,bool Logging)
{
m_pComm-> SetNewNetworkCallBack(NewNetwork,this); //问题



void CCommApp :: NewNetwork(unsigned short NetworkID,void * Parameter)

非托管代码头:

void SetNewNetworkCallBack(void(* NewNetworkCallBack)(UI nt16 NetworkID,void *
参数),void *参数);




这有与托管代码和非托管代码或UINT16无关。

显然NewNetwork是一个非静态成员函数,而VC7.1不是

只允许非法语法在你的
SetNewNetworkCallBack调用中引用它,它发出一个误导性的错误消息

暗示它是一个静态成员。 IIRC,VC8修复了语法问题,所以

裸NewNetwork参考将被禁止;相反,你必须使用

& CCommApp :: NewNetwork来形成指向成员的指针。无论如何,

解决方案是让NewNetwork保持静态。


P.S.将来包含

错误消息的完整文本(包括错误号)以及将问题抽象到一个简单的控制台程序中是有用的。例如(删除所有托管的东西不会
影响错误消息):


#using< mscorlib.dll>

使用命名空间系统;


#pragma unmanaged


void f(void(*)(unsigned short))

{

}


#pragma managed


struct X

{

void g(unsigned short)

{

}


void h( )

{

f(g);

}

};


int main()

{

}


C> ccr k.cpp

Microsoft(R)C / C ++优化编译器版本13.10.3077(适用于.NET)

Framework

版权所有(C)Microsoft Corporation 1984-2002。保留所有权利。


k.cpp

k.cpp(20):错误C2664:''f'':无法从''转换参数1 void

(unsigned short)''to''void(__ cdecl *)(unsigned short)''

范围内此名称的所有函数都不匹配目标类型


-

Doug Harrison

VC ++ MVP


James Crouch写道:

我正在尝试创建一个托管的c ++包装器,并且在运行SetNewNetworkCallBack时遇到了问题。它不喜欢NetworkID不是UInt16。我收到错误:CCommManager :: SetNewNetworkCallBack'':无法将参数1从''void
(unsigned short,void *)''转换为''void(__ cdecl *)( UInt16,void *)''

任何帮助都会被贬低。恶意代码如下。

James

托管代码:

CCommApp :: CCommApp(char chan,long baud,String * ServerAddress,int
ListenPort,bool Logging)
{
m_pComm-> SetNewNetworkCallBack(NewNetwork,this); //问题



void CCommApp :: NewNetwork(unsigned short NetworkID,void * Parameter)

非托管代码头:

void SetNewNetworkCallBack(void(* NewNetworkCallBack)(UI nt16 NetworkID,void *
参数),void *参数);




是CCommApp :: NewNetwork静态? NewNetworkCallBack原型

要求该函数是非成员或至少是静态的。只需在CComApp课程之外移动
NewNetwork功能,它就不属于

那里。


同时检查一下UInt16与unsigned short

完全相同(最好将Uint16重命名为unsigned short),调用约定

也必须匹配(__stdcall或__cdecl,更好明确指定。


Tom


James Crouch写道:


如果我正确地看到了,你传递一个托管方法作为一个非托管的

指针。那不行。您必须编写一个全局非托管

函数(在MC ++或C ++ / CLI中),它回调托管代码,并且
将此中间函数传递给非托管API。如果没有这个

的中间层,你无法将
传递给托管回调的托管回调。


另外,你不能把管理的空虚*传递给非管理部分,最好不要没有固定它。


Tom

I am trying to create a managed c++ wrapper and have run into a problem is
when SetNewNetworkCallBack is run. It doesn''t like that NetworkID isn''t an
UInt16. I get the error:

CCommManager::SetNewNetworkCallBack'' : cannot convert parameter 1 from ''void
(unsigned short,void *)'' to ''void (__cdecl *)(UInt16,void *)''

Any help would be appreicated. Offending code is below.

James
Managed Code:

CCommApp::CCommApp(char chan, long baud, String * ServerAddress, int
ListenPort, bool Logging)
{
m_pComm->SetNewNetworkCallBack(NewNetwork, this); //Problem
line
}

void CCommApp::NewNetwork(unsigned short NetworkID, void *Parameter)

Unmanaged Code Header:

void SetNewNetworkCallBack(void(*NewNetworkCallBack)(UI nt16 NetworkID, void*
Parameter), void* Parameter);

解决方案

On Tue, 20 Sep 2005 11:04:33 -0400, "James Crouch"
<ja**********@wpafb.af.mil> wrote:

I am trying to create a managed c++ wrapper and have run into a problem is
when SetNewNetworkCallBack is run. It doesn''t like that NetworkID isn''t an
UInt16. I get the error:

CCommManager::SetNewNetworkCallBack'' : cannot convert parameter 1 from ''void
(unsigned short,void *)'' to ''void (__cdecl *)(UInt16,void *)''

Any help would be appreicated. Offending code is below.

James
Managed Code:

CCommApp::CCommApp(char chan, long baud, String * ServerAddress, int
ListenPort, bool Logging)
{
m_pComm->SetNewNetworkCallBack(NewNetwork, this); //Problem
line
}

void CCommApp::NewNetwork(unsigned short NetworkID, void *Parameter)

Unmanaged Code Header:

void SetNewNetworkCallBack(void(*NewNetworkCallBack)(UI nt16 NetworkID, void*
Parameter), void* Parameter);



This has got nothing to do with managed vs unmanaged code or UINT16.
Apparently NewNetwork is a non-static member function, and VC7.1 is not
only allowing the illegal syntax for referring to it in your
SetNewNetworkCallBack call, it''s emitting a misleading error message which
implies it''s a static member. IIRC, VC8 fixes the syntax problem, so the
bare "NewNetwork" reference will be disallowed; instead, you''ll have to use
&CCommApp::NewNetwork to form a pointer to member. In any case, the
solution is to make NewNetwork static.

P.S. It would be useful in the future to include the complete text of the
error message, including error number, and to abstract the problem into a
simple console program. For example (removing all the managed stuff doesn''t
affect the error message):

#using <mscorlib.dll>
using namespace System;

#pragma unmanaged

void f(void (*)(unsigned short))
{
}

#pragma managed

struct X
{
void g(unsigned short)
{
}

void h()
{
f(g);
}
};

int main()
{
}

C>ccr k.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 13.10.3077 for .NET
Framework
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

k.cpp
k.cpp(20) : error C2664: ''f'' : cannot convert parameter 1 from ''void
(unsigned short)'' to ''void (__cdecl *)(unsigned short)''
None of the functions with this name in scope match the target type

--
Doug Harrison
VC++ MVP


James Crouch wrote:

I am trying to create a managed c++ wrapper and have run into a problem is
when SetNewNetworkCallBack is run. It doesn''t like that NetworkID isn''t an
UInt16. I get the error:

CCommManager::SetNewNetworkCallBack'' : cannot convert parameter 1 from ''void
(unsigned short,void *)'' to ''void (__cdecl *)(UInt16,void *)''

Any help would be appreicated. Offending code is below.

James
Managed Code:

CCommApp::CCommApp(char chan, long baud, String * ServerAddress, int
ListenPort, bool Logging)
{
m_pComm->SetNewNetworkCallBack(NewNetwork, this); //Problem
line
}

void CCommApp::NewNetwork(unsigned short NetworkID, void *Parameter)

Unmanaged Code Header:

void SetNewNetworkCallBack(void(*NewNetworkCallBack)(UI nt16 NetworkID, void*
Parameter), void* Parameter);



Is CCommApp::NewNetwork static? The NewNetworkCallBack prototype
requires that the function is non-member or at least static. Just move
the NewNetwork function outside of the CComApp class, it doesn''t belong
there.

Also check that UInt16 is exactly the same type as unsigned short
(better to rename Uint16 to unsigned short), and the calling conventions
must match too (both __stdcall or __cdecl, better to specify it explicitly).

Tom


James Crouch wrote:

If I see it correctly, you''re passing a managed method as an unmanaged
pointer. That''s not going to work. You have to write a global unmanaged
function (in MC++ or C++/CLI) that calls back to the managed code, and
pass this intermediate function to the unmanaged API. There''s no way you
can pass a managed callback to an unmanaged library without this
intermediate layer.

Also, you can''t pass a managed void* to the unmanaged part either, at
least not without pinning it.

Tom


这篇关于UINT16错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆