我正在尝试使用P/Invoke与本机DLL进行交互,但它需要一个in_addrstruct参数.我一直看到很多不同的定义,但最好用哪个?
另外,如何将C#IPAddress对象转换为in_addr结构?
在非托管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#调用?
我在我的程序中使用以下函数:
[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)等中遇到问题.你们可以就此提供一些反馈吗?如果有一些潜在的问题我怎样才能克服它们?
提前致谢.
朱波罗卡
我有以下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不平衡堆栈的错误,可能是由于托管签名与非托管签名不匹配造成的.
有人能看出这有什么问题吗?
我试图在带有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)
任何的想法?
我有一个API,它由标题(.h)和库(.a)文件组成.
我从未接触过C,我需要从C#访问此API并与其功能进行交互.
关于这个主题的大多数问题都说我需要做这样的事情[DllImport("insert_the_dll_name_here")]来调用DLL方法.但我只有.h和.a文件.
我该怎么办?
我应该将这些文件编译到DLL中然后使用pInvoke吗?如果是这样,怎么样?
或者我应该写一个包装类?如果是这样的话?
任何帮助表示赞赏.
我需要在C#项目中使用C库.我能怎么做?
更具体一点:出于效率原因,我需要使用strtod函数从字符串中提取双值(如"9.63074,9.63074 -5.55708e-006 0,01477.78").如果您有关于如何优化此操作的建议,请不要害羞,但主要问题仍然是标题指定.
我目前遇到一个从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 ++代码.我浏览了这个DLL教程,在我的c#app中使用它时遇到了麻烦.我将在下面发布所有代码.
我收到此PInvokeStackImbalance错误:'调用PInvoke函数'frmVideo :: Add'使堆栈失衡.这很可能是因为托管PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.
凯文,一如既往地谢谢
#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)
#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) 关于使用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 []?字节[]?是否需要任何元帅声明?