标签: pinvoke

在C#中使用in_addr

我正在尝试使用P/Invoke与本机DLL进行交互,但它需要一个in_addrstruct参数.我一直看到很多不同的定义,但最好用哪个?

另外,如何将C#IPAddress对象转换为in_addr结构?

c# pinvoke struct ip-address in-addr

0
推荐指数
1
解决办法
1975
查看次数

如何使用st#:: vector <> :: iterator作为C#中的参数调用非托管C++函数?

在非托管C++中,我有一个函数,我试图从C#调用.这个C++函数如下:

typedef std::vector<Point> Points;
typedef std::back_insert_iterator<Points> OutputIterator;

namespace MYNAMESPACE{
    DLLEXPORT OutputIterator convexHull(Points::iterator first, Points::iterator last,  OutputIterator result);
}
Run Code Online (Sandbox Code Playgroud)

从C++调用时,该函数使用如下:

  Points points, result;

  points.push_back(Point(0,0));
  points.push_back(Point(10,0));
  points.push_back(Point(10,10));
  points.push_back(Point(6,5));
  points.push_back(Point(4,1));

  OutputIterator resultIterator = std::back_inserter(result);

  MYNAMESPACE::convexHull( points.begin(), points.end(), resultIterator);
  std::cout << result.size() << " points on the convex hull" << std::endl;
Run Code Online (Sandbox Code Playgroud)

我已经开始编写C#代码,但我不知道我应该传递哪些类型:

[DllImport("unmanagedCode.dll", EntryPoint = "convexHull", CallingConvention = CallingConvention.StdCall)]
        public static extern ???<Point> convex_hull_2(???<Point> start, ???<Point> last, ???<Point> result);
Run Code Online (Sandbox Code Playgroud)

C#中的Point结构只是:

struct Point{
    double x;
    double y;
}
Run Code Online (Sandbox Code Playgroud)

这是传递数组或List of Point的情况吗?

我有C++的源代码,可以更改函数参数; 是否会有一种不同类型的参数可以更容易从C#调用?

c# c++ pinvoke

0
推荐指数
1
解决办法
2120
查看次数

SetParent()和GetParent()的安全性和稳定性

我在我的程序中使用以下函数:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr GetParent(IntPtr hWnd);
Run Code Online (Sandbox Code Playgroud)

我的问题是:这种方法安全稳定吗?我的开发机器是Windows XP,到目前为止我没有发现它的使用有任何问题.我想知道我是否可以在不同的版本(例如Windows Vista,Windows 7,等等),不同的cpus(x64)等中遇到问题.你们可以就此提供一些反馈吗?如果有一些潜在的问题我怎样才能克服它们?

提前致谢.

朱波罗卡

.net c# pinvoke winapi

0
推荐指数
1
解决办法
2523
查看次数

p /调用不平衡的堆栈错误

我有以下C++函数和C#p/invoke decleration:

//C#
[DllImport("capture.dll", EntryPoint = "setup")]
public static extern void captureSetup(int rr);

//C++
extern "C" {
    __declspec(dllexport) void setup(int rr)
Run Code Online (Sandbox Code Playgroud)

但是我收到一个关于ap/invoke不平衡堆栈的错误,可能是由于托管签名与非托管签名不匹配造成的.

有人能看出这有什么问题吗?

.net c# c++ pinvoke

0
推荐指数
1
解决办法
309
查看次数

Windows 7 x64上的GetAsyncKeyState

我试图在带有C#的windows7 x64上使用GetAsyncKeyState(i)来获取按键.它在x86上运行完美.这是我的代码:

[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(long vKey);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode); 

        search = false;
        int key_my;
        for (i = 0; i < 255; i++)
        {
            key_my = GetAsyncKeyState(i); // this should return -3.... but it does 46...........
            if ( key_my == (System.Int16.MinValue + 1))
            { search = true; break; }
        }
        if ( search == true)
        {
           ...//using if to keys here.
        }
Run Code Online (Sandbox Code Playgroud)

任何的想法?

c# pinvoke c#-2.0

0
推荐指数
1
解决办法
4571
查看次数

在.NET的*.a库中使用C函数

我有一个API,它由标题(.h)和库(.a)文件组成.

我从未接触过C,我需要从C#访问此API并与其功能进行交互.

关于这个主题的大多数问题都说我需要做这样的事情[DllImport("insert_the_dll_name_here")]来调用DLL方法.但我只有.h和.a文件.

我该怎么办?

我应该将这些文件编译到DLL中然后使用pInvoke吗?如果是这样,怎么样?

或者我应该写一个包装类?如果是这样的话?

任何帮助表示赞赏.

.net c c# pinvoke wrapper

0
推荐指数
1
解决办法
748
查看次数

在.NET中使用C库

我需要在C#项目中使用C库.我能怎么做?

更具体一点:出于效率原因,我需要使用strtod函数从字符串中提取双值(如"9.63074,9.63074 -5.55708e-006 0,01477.78").如果您有关于如何优化此操作的建议,请不要害羞,但主要问题仍然是标题指定.

c c# pinvoke dllimport

0
推荐指数
1
解决办法
1774
查看次数

返回int,API时Pinvoke


我目前遇到一个从C#windows应用程序调用Win32 DLL [Native]的问题.

我到目前为止.

C++源码:

extern "C" __declspec(dllexport) int PlaceSound(__in DWORD frequence, __in DWORD duration)
{
    Beep(frequence, duration);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C#来源:

[DllImport("SampleLib.dll")]
    public extern static int PlaceSound(int Freq, int Dura);

 public form1 { InitializeComponements; PlaceSound(150, 500); }
Run Code Online (Sandbox Code Playgroud)

在调试时,我接收到声音,但是,当库返回其整数值时,我似乎得到了一个pinvoke.

Pinvoke:
调用PInvoke函数'SoundTracer!SoundTracer.Form1 :: PlaceSound'使堆栈失衡.这很可能是因为托管PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.

我究竟做错了什么?

c# c++ api pinvoke

0
推荐指数
1
解决办法
847
查看次数

这个简单的C++ DLL在C#中不起作用

我一直在努力研究c ++中需要运行的c ++代码.我浏览了这个DLL教程,在我的c#app中使用它时遇到了麻烦.我将在下面发布所有代码.

我收到此PInvokeStackImbalance错误:'调用PInvoke函数'frmVideo :: Add'使堆栈失衡.这很可能是因为托管PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.

凯文,一如既往地谢谢

DLLTutorial.h

#ifndef _DLL_TUTORIAL_H_
#define _DLL_TUTORIAL_H_
#include <iostream>

#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

extern "C"
{
   DECLDIR int Add( int a, int b );
   DECLDIR void Function( void );
}

#endif
Run Code Online (Sandbox Code Playgroud)

DLLTutorial.cpp

#include <iostream>

#define DLL_EXPORT

#include "DLLTutorial.h"


extern "C"
{
   DECLDIR int Add( int a, int b )
   {
      return( a + b );
   }

   DECLDIR void Function( void )
   {
      std::cout << …
Run Code Online (Sandbox Code Playgroud)

c# c++ dll pinvoke

0
推荐指数
1
解决办法
735
查看次数

DLLImport c ++函数具有char*输入和输出参数

关于使用DllImport的一些特定问题,有很多文章.唉,我常常看到对同一个问题的不同回复.例如,有人说如果c ++函数返回一个char*和一个int*strLen,那么有人会说我应该在我的dllImport语句中使用StringBuilder而其他人说返回byte [],有些人在dllImport中有一个marshall语句,有些人不赞成"T.由于旧的C#/ .net版本,似乎需要一些答案.

所以问题是:如果来自c ++的dll调用相当简单,没有奇怪的调用约定或其他奇怪的项目,如果你有输出char*和size或输入char*和size,相应的DllImport函数应该是什么?

c++ .h
bool SendString(const char* pSendStr, long strSize);
bool ReadString(char* pReadStr, long& readStrSize); 
Run Code Online (Sandbox Code Playgroud)

相应的DllImports是什么?用字符串替换instr和outstr?StringBuilder的?的char []?字节[]?是否需要任何元帅声明?

c# pinvoke dllimport

0
推荐指数
1
解决办法
3000
查看次数

标签 统计

c# ×10

pinvoke ×10

c++ ×4

.net ×3

c ×2

dllimport ×2

api ×1

c#-2.0 ×1

dll ×1

in-addr ×1

ip-address ×1

struct ×1

winapi ×1

wrapper ×1