1

C ++ DLLをC#コードと通信させたいのですが、動作させることができません。C#テキストボックスに印刷するには、C ++DLLから「printf」メッセージをインポートする必要があります。それはうまくいきますそれは私にとっては問題ありません誰かが私を導くことができますか?私の主な優先事項は、C#がC ++DLLの「printf」関数を印刷できることです。C++DLLコードですが、コードはCとしてコンパイルされます。

ReceiverInformation()
{
     //Initialize Winsock version 2.2
     if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
     {
          printf("Server: WSAStartup failed with error %ld\n", WSAGetLastError());
          return -1;
     }
     else
     {
         printf("Server: The Winsock DLL status is %s.\n", wsaData.szSystemStatus);
         // Create a new socket to receive datagrams on.
         ReceivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

         if (ReceivingSocket == INVALID_SOCKET)
         {
              printf("Server: Error at socket(): %ld\n", WSAGetLastError());
              // Clean up
              WSACleanup();
              // Exit with error
              return -1;
         }
         else
         {
              printf("Server: socket() is OK!\n");
         }
     }
}

これはC#コードです。C++ DLLをインポートしようとしましたが、コードから作成されたサンプルコードで何をすべきかを誰かが指摘できます。

public partial class Form1 : Form
    {
        [DllImport(@"C:\Users\Documents\Visual Studio 2010\Projects\Server_Receiver Solution DLL\Debug\Server_Receiver.dll", EntryPoint = "DllMain")]
        private static extern int ReceiverInformation();

        private static int ReceiverInformation(IntPtr hWnd)
        {
            throw new NotImplementedException();
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //textBox1.Text = "Hello";
            this.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }           
    }
4

1 に答える 1

1

使用しないでくださいprintf。文字列をC#に渡します。このような:

C++DLLコードスニペットは次のとおりです。

extern "C" __declspec(dllexport) int Test(char* message, int length)
{
    _snprintf(message, length, "Test");
    return 1;
}

C#スニペットは次のとおりです。

[DllImport(@"test.dll")]
private static extern int Test(StringBuilder sb, int capacity);

static void Main(string[] args)
{
    var sb = new StringBuilder(32);
    Test(sb, sb.Capacity);

    // Do what you need here. In your case, testBox1.Text = sb.ToString()
    Console.WriteLine(sb);
}

StringBuilderの容量が、DLLエクスポートから出力するメッセージに適合することを確認してください。それ以外の場合は、切り捨てられます。

于 2012-05-31T04:47:09.980 に答える