我有一个c ++ dll,它公开了以下函数
long func(struct name * myname)
{
strcpy(myname->firstname,"rakesh");
strcpy(myname->lastname,"agarwal");
return S_OK;
}
struct name
{
char firstname[100];
char lastname[100];
}
Run Code Online (Sandbox Code Playgroud)
我想从C#应用程序调用此函数,所以我执行以下操作:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
unsafe public struct name
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)]
public string firstname;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string lastname;
} ;
[DllImport("C++Dll.dll")]
public unsafe static extern long func(name[] myname);
name[] myname = new name[1];
func(myname);
Run Code Online (Sandbox Code Playgroud)
应用程序构建成功.运行C#application .exe时,该函数func()被成功调用,并且能够在dll中成功填充字段.但是当函数返回到C#应用程序时,变量myname仍然会为结构字段(firstname和lastname)保留空值.
请建议更改,以便我能够填充字段值myname(以便在函数func()完成执行后,变量myname->firstname包含"rakesh"并myname->lastname包含"agarwal".
注意:StringBuilder不能在结构内部使用.
当我尝试从C#调用我的本机库时(使用Mono),我一直在获取DllNotFoundExceptions.我有一个本地库,我正在为其添加绑定.
这就是我所看到的:
$ grep DllImport generated/NativeLibrawLoader.cs | head -n 1
[DllImport("libfspotraw.dll")]
$ cat libfspotraw-sharp.dll.config
<configuration>
<dllmap dll="libglib-2.0-0.dll" target="libglib-2.0.so.0"/>
<dllmap dll="libgobject-2.0-0.dll" target="libgobject-2.0.so.0"/>
<dllmap dll="libgthread-2.0-0.dll" target="libgthread-2.0.so.0"/>
<dllmap dll="libatk-1.0-0.dll" target="libatk-1.0.so.0"/>
<dllmap dll="libgtk-win32-2.0-0.dll" target="libgtk-x11-2.0.so.0"/>
<dllmap dll="libgdk-win32-2.0-0.dll" target="libgdk-x11-2.0.so.0"/>
<dllmap dll="libgdk_pixbuf-2.0-0.dll" target="libgdk_pixbuf-2.0.so.0"/>
<dllmap dll="libfspotraw.dll" target="/opt/gnome//lib/f-spot/libfspotraw.so.0"/>
</configuration>
Run Code Online (Sandbox Code Playgroud)
并从strace日志中摘录:
5856 1247991911.215674 open("lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so", O_RDONLY) = -1 ENOENT (No such file or directory)
5856 1247991911.215814 open("lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so.la", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
5856 1247991911.215923 open("./lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so", O_RDONLY) = -1 ENOENT (No such file or directory)
5856 1247991911.215992 open("./lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so.la", …Run Code Online (Sandbox Code Playgroud) 我正试图从F#调用一个C库,并遇到了一个奇怪的问题.我有一个包含我所有extern功能的模块.底层C库有两个具有相同名称但不同参数的函数.当然,这在F#模块中是不允许的.
module C =
open System.Runtime.InteropServices
[<DllImport("libc", CallingConvention = CallingConvention.Cdecl)>]
extern int setValue(nativeint source, int value)
[<DllImport("libc", CallingConvention = CallingConvention.Cdecl)>]
extern int setValue(nativeint source, string value)
// the previous function declaration cause the following compile-time error:
// Duplicate definition of value 'setValue'
Run Code Online (Sandbox Code Playgroud)
有什么特殊的方法可以解决这个问题吗?我无法改变C库.
我有一个用C++编写的DLL(Player.dll),内部使用Windows GDI.我有一个用Windows Forms编写的应用程序(基本上是一个视频播放器),内部调用API Player.dll来使用p/invoke技术在屏幕上呈现实际图形:
public class ProxyPlayer
{
[DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PlayVideo")]
public static extern void Play(int playerHandle, out TWResult result);
[DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PauseVideo")]
public static extern void Pause(int playerHandle);
//other methods
}
Run Code Online (Sandbox Code Playgroud)
它正在发挥作用.
但是现在,我想使用Silverlight 4.0编写相同的应用程序.如您所知,大多数Windows GDI都可以HWND在屏幕上渲染图形,这就是我传递playerHandle给ProxPlayer方法的原因,正如您自己可以看到的那样.Window Forms' UserControl定义了一个名为Handletype 的公共属性,IntPtr它等同于HWND,所以我将它传递给ProxyPlayer方法.它解决了我的问题.但Silverlight UserControl没有任何此类财产.
所以我的问题基本上是,我如何处理我的silverlight控件?因为没有它,我无法调用API Player.dll.但我要从中呼叫APS.我没有任何其他选项,因为DLL是实际的引擎,它确实解释了大量数据然后渲染它们.所以请建议我符合我的要求的解决方案!
注意:假设我的silverlight应用程序将始终在Microsoft Windows上运行.所以我没有问题对Windows GDI进行设置.
几个快速问题.我有一个DMX王USB照明控制器,我正试图控制.
它基于Open DMX协议(来自Entec),提供ac#class.我已经将设备插入RGB设备,如果我用他们的驱动程序测试USB设备,它连接到COM4,当我将他们的软件切换到发送模式时,我可以设置单独的DMX通道.
使用他们的OpenDMX类,进行一些修改(核心是相同的,我刚刚添加了一些额外的错误检查,我可以找到设备,查询它的信息等.当我打开设备时,我得到一个句柄.我可以写使用FT_Write到那个设备但不管我做什么,实际上没有灯亮起来.
以下是一些相关的代码片段:
public static byte[] buffer;
[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Open(UInt32 uiPort, ref uint ftHandle);
[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Write(uint ftHandle, IntPtr lpBuffer, UInt32 dwBytesToRead, ref UInt32 lpdwBytesWritten);
public static void writeData()
{
while (!done)
{
try
{
initOpenDMX();
status = FT_SetBreakOn(handle);
status = FT_SetBreakOff(handle);
bytesWritten = write(handle, buffer, buffer.Length);
if (bytesWritten == 0)
{
break;
}
System.Threading.Thread.Sleep(25);
}
catch (Exception)
{
break;
}
}
Connected = false;
done = false;
}
Run Code Online (Sandbox Code Playgroud)
所有状态都以FT_Ok的形式返回,bytesWritten返回为512(此USB控制器上的通道数)
我一直在想我错过了将设备设置为传输模式或类似的设备(它只有一个DMX插槽)
public …Run Code Online (Sandbox Code Playgroud) 很抱歉这个问题很长.我只是想包括我目前对这个问题所知的一切.
我正在使用Visual Studio 2008在C#中创建一个Windows Form程序,该程序调用用C++编写的库.
C++ DLL分析测量数据,该数据由几个样本组成.样本通过function(PDSetWaveSample)传递给库,该函数将struct作为参数.
在设置所有样本之后,使用另一个函数(PDPreProcess)处理测量数据,该函数也将结构作为参数.
C++ DLL将所有测量数据保存在其内部数据结构中,并进行所有处理以获得结果.
在程序开始处理测量数据之前,一切似乎都能正常运行.此时程序崩溃并退出此错误:
程序'XXX.vshost.exe:Managed'已退出,代码为-1073741819(0xc0000005).
我将在本问题的后面添加一些调试信息和C#源代码.
您是否有任何提示如何前进或可能导致这种情况?
我正在运行Windows XP Professional,版本2002 SP 3.
当程序崩溃时,它首先给出此错误消息
未知模块中出现未处理的"System.ExecutionEngineException"类型异常.
以及打破或继续的可能性.我选择休息.
之后我看看大会:
没有为任何调用堆栈帧加载符号.源代码无法显示.
根据调试器,发生错误的位置的程序集如下所示:
7C90E4FA call 7C90E528
7C90E4FF mov eax,dword ptr [esp]
7C90E502 mov esp,ebp
7C90E504 pop ebp
7C90E505 ret
7C90E506 lea esp,[esp]
7C90E50D lea ecx,[ecx]
7C90E510 mov edx,esp
7C90E512 sysenter
==>7C90E514 ret
7C90E515 lea esp,[esp]
7C90E51C lea esp,[esp]
7C90E520 lea edx,[esp+8]
7C90E524 int 2Eh
7C90E526 ret
7C90E527 nop
7C90E528 push ebp
7C90E529 mov ebp,esp …Run Code Online (Sandbox Code Playgroud) 我有一个包含以下类型的Delphi DLL:
type
TStepModeType = (smSingle, smMultiStep);
TParameter = record
Number: Integer;
end;
TStruct = record
ModType: PAnsiChar;
ModTypeRev: Integer;
ModTypeID: Integer;
RecipeName: PAnsiChar;
RecipeID: Double;
RootParamCount: Integer;
StepMode: TStepModeType;
ParamCount: Integer;
Parameters: array of TParameter;
end;
Run Code Online (Sandbox Code Playgroud)
我需要从C#调用这个DLL,传递一个对应于DLL将填充并返回的Delphi类型的ref对象.我在C#代码中定义了这样的结构:
enum stepModeType
{
Single,
MultiStep
}
[StructLayout(LayoutKind.Sequential)]
struct parameter
{
public int Number;
}
[StructLayout(LayoutKind.Sequential)]
struct recipe
{
public string modType;
public int modTypeRev;
public int modTypeId;
public string recipeName;
public double recipeId;
public int rootParamCount;
public stepModeType stepMode;
public int paramCount; …Run Code Online (Sandbox Code Playgroud) 我可以保证在Window.SourceInitialized活动开始之前总是提出Window.Loaded活动吗?我需要HwndSource在Window.Loaded事件处理程序中进一步处理该对象,我不确定它是否始终可用
我有一个程序,使用Tesseract从图像中提取文本.我制作了一个Native C++ DLL,它通过P/Invoke在C#中使用.我的C#应用程序是基于控制台的x64,DLL也是64位.
部署到Windows Server后,我收到一个错误,指出DLL(我已经制作的)不存在.错误消息如下.
System.DllNotFoundException:无法加载DLL'TesseractX64.dll':找不到指定的模块.(来自HRESULT的异常:0x8007007E)在Utilities.Finance.PDFParser.PDF.OCRObject.GetUTF8Text(String path,String lang,String imgPath)
我确信DLL存在于该路径中.TesseractX64.DLL与C#应用程序放在同一个文件夹中,因此它应该没有任何问题.
这是我的代码:
[HandleProcessCorruptedStateExceptions]
[DllImport(@"TesseractX64.dll", EntryPoint = "GetUTF8Text", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr GetUTF8Text(string path, string lang, string imgPath);
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试了什么:
它在我用于开发程序的Windows 7 x64计算机上运行得非常好.
我试图在C#应用程序中实现GetWindowDpiAwarenessContext,但没有成功。
relevent头文件是:
windef.h
DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
typedef enum DPI_AWARENESS {
DPI_AWARENESS_INVALID = -1,
DPI_AWARENESS_UNAWARE = 0,
DPI_AWARENESS_SYSTEM_AWARE = 1,
DPI_AWARENESS_PER_MONITOR_AWARE = 2
} DPI_AWARENESS;
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)
Run Code Online (Sandbox Code Playgroud)
WinUser.h
WINUSERAPI
DPI_AWARENESS_CONTEXT
WINAPI
GetWindowDpiAwarenessContext(
_In_ HWND hwnd);
Run Code Online (Sandbox Code Playgroud)
我在用:
/// <summary>
/// Class for native methods.
/// </summary>
internal static class NativeMethods {
[DllImport("user32.dll")]
internal static extern IntPtr GetWindowDpiAwarenessContext(IntPtr hWnd);
...
// Dpi awareness context
IntPtr dpiAwarenessContext = NativeMethods.GetWindowDpiAwarenessContext(process.Handle);
if (dpiAwarenessContext == (IntPtr)(-1)) {
sb.AppendLine(" DPI …Run Code Online (Sandbox Code Playgroud)