Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用C++;来自VB.NET的函数 我在C++中创建了一个带有导出函数的DLL,这样: extern "C" __declspec(dllexport) int __stdcall AlmacenarPedido(DWORD dwTelefono, LPCTSTR lpszFechaPedido, LPCTSTR lpszHoraPedido, LPCTSTR lpszCodigoInterno, LPCTSTR lpszDescripcionProducto, int iCantidadProducto, int iValorUnitario, LPCTSTR lpszFechaEntrega, LPCTSTR lpszHoraEntrega, int iKilosProducto, LPCTSTR lpszFechaDespacho, LPCTSTR lpszHoraDespacho)_C++_Vb.net_Dllimport_Dllexport - Fatal编程技术网

调用C++;来自VB.NET的函数 我在C++中创建了一个带有导出函数的DLL,这样: extern "C" __declspec(dllexport) int __stdcall AlmacenarPedido(DWORD dwTelefono, LPCTSTR lpszFechaPedido, LPCTSTR lpszHoraPedido, LPCTSTR lpszCodigoInterno, LPCTSTR lpszDescripcionProducto, int iCantidadProducto, int iValorUnitario, LPCTSTR lpszFechaEntrega, LPCTSTR lpszHoraEntrega, int iKilosProducto, LPCTSTR lpszFechaDespacho, LPCTSTR lpszHoraDespacho)

调用C++;来自VB.NET的函数 我在C++中创建了一个带有导出函数的DLL,这样: extern "C" __declspec(dllexport) int __stdcall AlmacenarPedido(DWORD dwTelefono, LPCTSTR lpszFechaPedido, LPCTSTR lpszHoraPedido, LPCTSTR lpszCodigoInterno, LPCTSTR lpszDescripcionProducto, int iCantidadProducto, int iValorUnitario, LPCTSTR lpszFechaEntrega, LPCTSTR lpszHoraEntrega, int iKilosProducto, LPCTSTR lpszFechaDespacho, LPCTSTR lpszHoraDespacho),c++,vb.net,dllimport,dllexport,C++,Vb.net,Dllimport,Dllexport,我正在尝试从VB.NET调用此函数 这是DllImport: <DllImport("ComTesting.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.StdCall)> Function AlmacenarPedido(ByVal dwTelefono As Long, ByVal lpszFechaPedido As String, ByVal lpszHoraPedido As Str

我正在尝试从VB.NET调用此函数

这是DllImport:

<DllImport("ComTesting.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.StdCall)>
Function AlmacenarPedido(ByVal dwTelefono As Long, ByVal lpszFechaPedido As String, ByVal lpszHoraPedido As String,
                         ByVal lpszCodigoInterno As String, ByVal lpszDescripcionProducto As String,
                         ByVal iCantidadProducto As Integer, ByVal iValorUnitario As Integer, ByVal lpszFechaEntrega As String, ByVal lpszHoraEntrega As String,
                         ByVal iKilosProducto As Integer, ByVal lpszFechaDespacho As String, ByVal lpszHoraDespacho As String) As Integer
End Function
调用时,将抛出AccessExceptionException

需要帮忙吗

编辑:

堆栈跟踪:

   en Testing.MainModule.AlmacenarPedido(Int64 dwTelefono, String& lpszFechaPedido, String& lpszHoraPedido, String& lpszCodigoInterno, String& lpszDescripcionProducto, Int32 iCantidadProducto, Int32 iValorUnitario, String& lpszFechaEntrega, String& lpszHoraEntrega, Int32 iKilosProducto, String& lpszFechaDespacho, String& lpszHoraDespacho)
   en Testing.MainModule.Main() en C:\WorkingFolder\Proyectos\Lipigas\GasProvidencia\Testing\MainModule.vb:línea 37
   en System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   en System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   en System.Threading.ThreadHelper.ThreadStart()

我明白问题所在。第一个参数,
dwTelefono
,在DLL中声明为DWORD,但在Pinvoke声明中声明为
Long
。VB.NET中的DWORD是32位的,long是64位的。因此,调用DLL时堆栈设置错误

从以下位置更改第一个参数声明:

 Function AlmacenarPedido(ByVal dwTelefono As Long,
为此:

Function AlmacenarPedido(ByVal dwTelefono As UInt32,
我在本地进行了测试,并确认已修复

  • 关于你的第一个问题:selbie是绝对正确的。Net“Long”C/C++“DWORD”。我相信你已经修好了


  • 同样,关于第二个问题,
    String&lpszFechaPedido
    !=<代码>LPCTSTR lpszFechaPedido!您需要
    显示完整的堆栈跟踪。添加的堆栈跟踪将代码显示到DLL导出的函数中。另外,您的DLL是否编译为UNICODE?(提示:LPCTSTR不明确,导致与.net中的字符集声明有关的混淆。请显式使用LPCSTR或LPCWSTR)。我已按LPCWSTR更改了LPCTSTR,但同样的情况也发生了。DLL的主体是不相关的,因为导出的函数甚至没有被调用可能的提示:
    DWORD
    是32位,您的导入将
    dwTelefono
    指定为
    Long
    ,不应该是
    Integer
    ?我正要指出同样的事情。你说得很对:)我已经试过了,而且成功了,至少我不再有那个错误了,但是字符串传递不正确。我已将它们定义为“char*”,但只传递垃圾。请将您的字符集更改为:
    charset:=charset.Ansi
    ,让pinvoke将.net字符串转换为Ansi/ascii。对于第二个问题,我尝试了几种方法,但都没有成功。我提出了一个新问题:如果塞尔比帮忙,那么请接受并投票支持他的回答。
    Function AlmacenarPedido(ByVal dwTelefono As UInt32,