0

我正在从我的 C# 应用程序中的 dll 调用 C/C++ 函数。我一生都无法弄清楚如何正确编组数据。

这是我试图调用的 API 函数的信息:

LONG LoginDialog(HWND hWndParent,LPCWSTR lpctstrTitle,ULONG ulFlags,LPWSTR lptstrDataSource,LONG lDSLength,LPCWSTR lpctstrUsername,LPCWSTR lpctstrPassword,LPCWSTR lpctstrSchema);

参数:
[in] hWndParent 指定要显示的登录对话框的父窗口句柄。
[in] lpctstrTitle 指向以空字符结尾的字符串的指针,该字符串指定要显示的登录对话框的标题。指定 NULL 指针以使用默认登录对话框标题。
[in] ulFlags 指定登录操作和对话框样式掩码。它可以是 0 或登录对话框样式标志中列出的标志的按位或组合。
[in,out] lptstrDataSource 指向以 null 结尾的字符串缓冲区的指针,指定要登录的数据源的名称。在输出时,此缓冲区接收用户登录的数据源的名称(以防数据源名称在登录对话框中更改)。
[in] lDSLength 指定由 lptstrDataSource 指定的字符串缓冲区的长度。
[in] lpctstrUsername 指向指定用户名的以 null 结尾的字符串的指针。
[in] lpctstrPassword 指向指定密码的以空字符结尾的字符串的指针。
[in] lpctstrSchema 指向以 null 结尾的字符串的指针,指定架构文件的完整路径。如果不需要架构,请指定 NULL 指针。

这是我的代码:

[DllImport("dmawin.dll", CharSet = CharSet.Unicode)] 
private static extern int LoginDialog(IntPtr pWndParent, string pStrTitle, 
uint pFlags, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder pStrDataSource, 
int pDSLength, string pStrUsername, string pStrPassword, string pStrSchema);


private bool Login(string pDataSource, string pLoginName, 
string pPassword, string pScheme)
{
    private const int MAX_DB_NAME = 256;
    IntPtr handle = ParentForm.Handle;
    var sb = new StringBuilder(pDataSource, MAX_DB_NAME);

    //function call
    LoginDialog(handle, null, flags, ref sb, MAX_DB_NAME, pLoginName, 
    pPassword, pScheme);
}

我很确定我将第 4 个参数编组错误(LPWSTR lptstrDataSource)。我尝试了在网上找到的不同答案,但到目前为止没有一个对我有用。

我也首先收到此警告。抱歉没有澄清:

托管调试助手“LoadFromContext”检测到问题..

附加信息:程序集是使用 LoadFrom 上下文从“dll 位置”加载的。使用此上下文可能会导致序列化、强制转换和依赖解析的意外行为。在几乎所有情况下,建议避免使用 LoadFrom 上下文。这可以通过在全局程序集缓存或 ApplicationBase 目录中安装程序集并在显式加载程序集时使用 Assembly.Load 来完成。

4

0 回答 0