powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / rundll32 c# dll function
10 сообщений из 10, страница 1 из 1
rundll32 c# dll function
    #39638857
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет,
есть необходимость запускать существующий функционал некоторых c# dll с помощью утилиты rundll32.
я это пытюсь реализовать через следующую цепочку:
C# Library(dll) -> C++/CLI Library(lib) -> Native C++ Library for rundll32(dll)
Проблема в том, что когда я запускаю функционал из моей "Native C++ Library for rundll32(dll)" с помощью консольного c++ приложения, то все работает. Если пытюсь этот же функционал запустить утилитой rundll32.exe, то она вылетает, без ошибки, имено в том месте где я пытаюсь запустить C# функцию.
Вот пример кода:
C# Library(dll)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
using System.Windows.Forms;
namespace ManagedNET
{
    public static class CSharpClass
    {
        public static void ShowValue()
        {
            MessageBox.Show("This message is from C# library!", "C# Message Box", MessageBoxButtons.OKCancel);
        }
    }
}


C++/CLR Library(lib)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#pragma once
using namespace System;
using namespace System::Reflection;

namespace ManagedCCLI
{
	public ref class DoWork
	{
		public:void ShowCSharpMessageBox()
		{
			ManagedNET::CSharpClass::ShowValue();
			return;
		}
	};
}

__declspec(dllexport) void ShowMessageBox()
{
	ManagedCCLI::DoWork work;
	work.ShowCSharpMessageBox();
}


Native C++ Library for rundll32(dll).H
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#pragma once
namespace internal_obj {
	class test_c {
	public:
		void fn_message_show(void);
	};
}

extern "C" __declspec(dllexport) void ShowMessage(void);


Native C++ Library for rundll32(dll).CPP
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
#include "stdafx.h"
#include "Step3Rundll32Library.h"
#include <exception>
#include <windows.h>
using namespace std;

_declspec(dllexport) void ShowMessageBox();
void internal_obj::test_c::fn_message_show(void)
{
	try
	{
		ShowMessageBox();
	}
	catch (const std::exception& ex)
	{
		MessageBoxA(NULL, ex.what(), "Error", MB_OK);
	}
	catch (...)
	{
		MessageBoxA(NULL, "Unknown error", "Error", MB_OK);
	}
}

extern "C" __declspec(dllexport) void ShowMessage(void)
{
	internal_obj::test_c tmp;
	tmp.fn_message_show();
}


плиз, подскажите, почему
Код: plaintext
1.
extern "C" __declspec(dllexport) void ShowMessage(void)

в обычной c++ консоли выполняется нормально, а rundll32 тупит?
пример vs2017 прилагается
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39638942
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jafaв обычной c++ консоли выполняется нормально, а rundll32 тупит?

rundll32может вызывать только функции с определённой сигнатурой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39638960
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovrundll32может вызывать только функции с определённой сигнатурой.

я же сорцы повыкладывал, или не видно?
вот эта сигнатура:
Код: plaintext
1.
extern "C" __declspec(dllexport) void ShowMessage(void);
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39638962
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jafaя же сорцы повыкладывал, или не видно?
вот эта сигнатура:

Специально для человека, неспособного скопировать текст из консоли, повторяю медленно: эта
сигнатура не соответствует той, которая требуется для использования rundll32.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39638999
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovэта сигнатура не соответствует той, которая требуется для использования rundll32.

сорри, но с вашей стороны это звучит примерно так: "это не правильно, а как правильно не скажу или не знаю"
если у вас имеется правильный пример, так укажите его тут.
мой вариант работает для rundll32, только если не использовать функционал из C# library.
Рабочий пример:
Код: plaintext
1.
2.
3.
4.
extern "C" __declspec(dllexport) void ShowMessage(void)
{
	MessageBoxA(NULL, "Hello world! How are you?", "Error", MB_OK);
}


Код: plaintext
1.
cmd>rundll32.exe DllTest.dll, ShowMessage
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39639007
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jafaсорри, но с вашей стороны это звучит примерно так: "это не правильно, а как правильно не
скажу или не знаю"
если у вас имеется правильный пример, так укажите его тут.

"Прочитайте мне документацию вслух, с выражением!", ага... Сам иди читай:
https://support.microsoft.com/en-us/help/164787/info-windows-rundll-and-rundll32-interface
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39639138
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jafaесли нет чего дельного ответить, просьба не писать тут, проходим мимо
цель этой темы не для изъяснений, что? и почему?нет, просто иногда полезно узнать у автора решаемую задачу подробно. Это иногда помогает найти другие, правильные решения.
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39639321
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov https://support.microsoft.com/en-us/help/164787/info-windows-rundll-and-rundll32-interface

это замечание правильное, спасибо Dimitry, но оно мою проблему не решило:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//cmd>rundll32.exe Step3Rundll32Library.dll,_ShowMessage@16
extern "C" __declspec(dllexport) void CALLBACK ShowMessage(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
	internal_obj::test_c tmp;
	tmp.fn_message_show();
}


Dimitry, вы эту ссылку могли указать сразу, как основу вашего замечания, и это был бы хороший ответ, сразу понятный.
Но вместо этого, похоже, вы начали отвечать с раздражением )))
пожалуйста, будьте более сдержанным в своих ответах. Спасибо.
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39639364
Jafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbнет, просто иногда полезно узнать у автора решаемую задачу подробно. Это иногда помогает найти другие, правильные решения.
чаще всего, таки вопросы уводят в сторону от основной проблемы.
согласен, что можно найти более правильное решение, но оно будет иметь свои компромиссы, и это уже будет план Б )))
Просто, на старте темы "а давайте что-то поменяем более масштабно" - звучит не очень.
но в любом случае, спасибо, что обратили внимание на мою тему
...
Рейтинг: 0 / 0
rundll32 c# dll function
    #39639379
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jafaвы эту ссылку могли указать сразу, как основу вашего замечания, и это был бы хороший
ответ, сразу понятный.

Эта ссылка была вторая в гугле. И в момент написания ответа я уже закрыл браузер,
поскольку убедился, что найти её очень просто.

"Сразу понятные" ответы плохи тем, что не имеют воспитательного эффекта, скорее наоборот,
вырабатывают паразитарные наклонности у ТСов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / rundll32 c# dll function
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]