- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 CPP 中有一个函数,其原型(prototype)如下:
char* complexFunction(char* arg1, ...);
我使用 DLLImport 属性从 C# 导入它。问题是:我如何在 C# 中定义原型(prototype)(在 DLLImport 属性下)?我如何将参数传递给这个函数?谢谢
câu trả lời hay nhất
这称为可变参数函数。关于对它们的 P/Invoke 支持的信息相当稀少,这是我发现的。
我找不到直接 DllImport
参数数量可变的函数的方法。我必须将参数的 DllImport
所有变体 作为不同的重载。
我们以wsprintf为例.它在 winuser.h
中具有以下原型(prototype):
int WINAPIV wsprintf(
LPTSTR lpOut,
LPCTSTR lpFmt,
...);
它可以像这样在 C# 中使用:
sử dụng Hệ thống;
sử dụng System.Text;
using System.Runtime.InteropServices;
class C {
// first overload - varargs list is single int
[DllImport("user32.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int wsprintf(
[Out] StringBuilder buffer,
string format,
int arg);
// second overload - varargs list is (int, string)
[DllImport("user32.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int wsprintf(
[Out] StringBuilder buffer,
string format,
int arg1,
string arg2);
public static void Main() {
StringBuilder buffer = new StringBuilder();
int result = wsprintf(buffer, "%d + %s", 42, "eggs!");
Console.WriteLine("result: {0}\n{1}", result, buffer);
}
}
现在处理您的 complexFunction
。
char* complexFunction(char* arg1, ...);
它的可变参数列表应该以同样的方式处理:通过提供所有有用的重载。但还有另一个复杂因素——返回类型。我假设 complexFunction
分配并返回 char
数组。在这种情况下,调用者很可能负责数组的释放。为此,您还应该导入释放例程,我们称它为 void free(void*)
。
假设所有这些假设,使用 complexFunction
的 C# 代码将如下所示:
sử dụng Hệ thống;
sử dụng System.Text;
using System.Runtime.InteropServices;
class C {
[DllImport("your.dll",
CallingConvention=CallingConvention.Cdecl,
CharSet=CharSet.Ansi)]
static extern IntPtr complexFunction(
string format,
int arg1, int arg2);
[DllImport("your.dll", CallingConvention=CallingConvention.Cdecl)]
static extern void free(IntPtr p);
public static void Main() {
IntPtr pResult = complexFunction("%d > %s", 2, 1);
string sResult = Marshal.PtrToStringAnsi(pResult);
free(pResult);
Console.WriteLine("result: {0}", sResult);
}
}
关于C# 从 CPP 调用未知数量的参数的 CPP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/214953/
Tóm lại: Tôi muốn trích xuất các tùy chọn khác nhau từ các tham số mẫu biến đổi, nhưng không chỉ theo nhãn mà còn theo chỉ mục của các tham số đó, là các nhãn không xác định. Tôi thích các phương thức tăng cường (chẳng hạn như chiến lược heap hoặc lockfree), nhưng muốn làm cho nó tương thích với S
Tôi có thể cung cấp một số trợ giúp về câu lệnh IF excel trong ô không? Nó đang làm gì vậy? Đánh giá nào đã được thực hiện trên "BaselineAmount"? =IF(Số tiền cơ sở, (Phương sai/Baselin
Tôi đang sử dụng phương pháp sau: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
Tôi đang sử dụng CodeGear RAD Studio IDE. Để kiểm tra ứng dụng của tôi với các tham số dòng lệnh, tôi đã sử dụng trường Tham số trong menu Chạy->Tham số nhiều lần. Nhưng mỗi lần tôi cho nó một giá trị mới, nó lại không thể kéo xuống từ mức
Tôi đã viết một số mã cho loại thẻ tín dụng, dán bên dưới. Tôi có một hàm tạo chấp nhận các biến trên và đang xem xét một số cách để định dạng các biến này thành chuỗi để đầu ra cuối cùng sẽ giống như Số: 1234 5678 9012 3456 Hạn chót:
Tham số MySql IN - Giá trị tham số VarChar IN có yêu cầu dấu ngoặc đơn khi được sử dụng trong quy trình được lưu trữ không? Tôi đã tạo mã ASP cổ điển như thường lệ nhưng tôi không cập nhật cột. Tôi có cần trích dẫn các thông số VarChar không?
Bắt đầu như bên dưới nhưng dường như không thể tìm ra cách hoàn thành nó. Về cơ bản, nếu tôi gọi myTest([one, Two, Three], 2); thì nó sẽ trả về phần tử thứ ba. Phải sử dụng vòng lặp for để tìm giải pháp của tôi. chức năng
Khi truyền 1113355579999 làm tham số, giá trị sẽ trở thành 959050335 bên trong hàm. Gọi (main.c): printf("%d\n", FindCommonDigit(111335557999
Câu hỏi này đã có câu trả lời ở đây: Java là "pass-by-reference" hay "pass-by-value" (92 câu trả lời) Đã đóng 9 năm trước. lớp công khai StackOve
Tôi thực sự bối rối, khi một cái gì đó như 1 == scanf("%lg", &entry) được đổi chỗ cho scanf("%lg", &entry) == 1 thì không có gì khác biệt. Cuốn sách thí nghiệm của tôi nói vế trước, nhưng tôi nghĩ vế sau có thể hiểu được. 1 =
Tôi đang cố gắng sử dụng Delphi 7 bằng cách sử dụng hàm gọi SetupDiGetDeviceRegistryProperty. Cuộc gọi đến từ hàm ví dụ SetupEnumAvailableComPorts. Nó trông như thế này:
Tôi cần triển khai hiển thị một số sự kiện trên dự án hiện có. Tôi không thể thay đổi cấu trúc cơ sở dữ liệu. Trong Bộ điều khiển của tôi, tôi đang chuyển dấu thời gian (từ yêu cầu ajax) và tôi cần hiển thị 8 sự kiện trước đó. Vì vậy, nếu dấu thời gian là (sau khi chuyển đổi)
Mới đối với đường ray. Theo hướng dẫn về liên kết đa hình, tôi đã tìm thấy điều này để đặt @client trong việc tạo và hủy. @client = Client.find(params[:client_id] || p
Tôi có thể chạy chương trình Java -Xms256M thông qua Eclipse bằng cách đặt tham số VM thành -Xmx1024m. Bây giờ tôi muốn chạy cùng một chương trình Java (jar) thông qua tệp .bat trong Windows
Tôi có một DLL Delphi hoạt động khi được ứng dụng Delphi gọi và xuất một phương thức được khai báo là: Thủ tục ProduceOutput(request,inputs:widestring; va
Sau khi xem qua tài liệu và ví dụ, tôi vẫn chưa tìm ra chính xác các tham số trong tệp lược đồ.yaml được sử dụng ở đâu. Sử dụng mẫu mã AWS tại đây: https://github.com/aws-samples/aws-proton
Hướng dẫn sử dụng: thủ tục get_user_profile ( i_attuid trong ras_user.attuid%type, i_data_group trong data_g
Tôi có một chuỗi được truyền dưới dạng tham số cho quy trình được lưu trữ của mình. dim AgentString as String = " 'test1', 'test2', 'test3' " Tôi muốn sử dụng khai báo tham số này trong IN. VÀ
Câu hỏi này đã có câu trả lời: Khi nào tôi nên sử dụng "this" trong lớp học? (17 câu trả lời) Đã đóng 6 năm trước. Tôi đã chạy một số mã java và tôi thấy có điều gì đó mà tôi không hiểu lắm. Tại sao?
Tôi gõ cuộn (0,10,200,10); nhưng khi chạy nó chuyển chuỗi "xxpos" hoặc "yypos", tôi đã thử mà không có dấu nháy đơn nhưng nó không hoạt động. cuộn = hàm (xp
Tôi là một lập trình viên xuất sắc, rất giỏi!