Вызов неуправляемой DLL из C #. Взять 2 - PullRequest
2 голосов
/ 12 апреля 2010

Я написал программу на c #, которая вызывает dll на c ++, которая выводит аргументы командной строки в файл

Когда c ++ вызывается с помощью команды rundll32, он отображает аргументы командной строки без проблем, однако, когда он вызывается из c #, это не так.

Я задал этот вопрос , чтобы попытаться решить мою проблему, но я изменил его в своей тестовой среде и думаю, что стоит задать новый вопрос.

Вот c ++ dll

#include "stdafx.h"
#include "stdlib.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

extern "C" __declspec(dllexport) int WINAPI CMAKEX(
    HWND hwnd,
    HINSTANCE hinst,
    LPCSTR lpszCommandLine,
    DWORD dwReserved)
{

    ofstream SaveFile("output.txt");
    SaveFile << lpszCommandLine;
    SaveFile.close();

    return 0;
}

Вот приложение c #

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Net;

namespace nac
{
    class Program
    {
        [DllImport("cmakca.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern bool CMAKEX(IntPtr hwnd, IntPtr hinst, string lpszCmdLine, int nCmdShow);

        static void Main(string[] args)
        {
            string cmdLine = @"/source_filename proxy-1.txt /backup_filename proxy.bak /DialRasEntry NULL /TunnelRasEntry DSLVPN /profile ""C:\Documents and Settings\Administrator\Application Data\Microsoft\Network\Connections\Cm\dslvpn.cmp""";
            const int SW_SHOWNORMAL = 1;
            CMAKEX(IntPtr.Zero, IntPtr.Zero, cmdLine, SW_SHOWNORMAL).ToString();
        }
    }
}

Выходные данные команды rundll32:

rundll32 cmakex.dll,CMAKEX /source_filename proxy-1.txt /backup_filename proxy.bak /DialRasEntry NULL /TunnelRasEntry DSLVPN /profile ""C:\Documents and Settings\Administrator\Application Data\Microsoft\Network\Connections\Cm\dslvpn.cmp"

/source_filename proxy-1.txt /backup_filename proxy.bak /DialRasEntry NULL /TunnelRasEntry DSLVPN /profile ""C:\Documents and Settings\Administrator\Application Data\Microsoft\Network\Connections\Cm\dslvpn.cmp"

однако при запуске приложения c # выводится

/

1 Ответ

2 голосов
/ 12 апреля 2010

LPCSTR это не Unicode, не так ли? Просто используйте ANSI, и все будет хорошо: CharSet = CharSet.Ansi

...