簡體   English   中英

C ++將DLL加載到默認的AppDomain中

[英]C++ Loading a DLL into the default AppDomain

使用我不存在的C ++知識(嘿,至少我知道指針是什么:P),我設法將一些代碼示例放在一起,以創建一個將DLL文件注入另一個程序的解決方案。

不幸的是,它是我注入的DLL不能正常工作:它成功顯示消息框(所以我知道DLL正在運行),但它實際上並沒有創建指定類型的實例(來自托管DLL,它具有靜態類型為Injectee的構造函數,寫入文件)。 那么,任何人都可以幫助我解決我的錯誤嗎? (注意,托管DLL是相同的.Net版本,並安裝到GAC。在我注入的應用程序的同一文件夾中也有一個副本)

這是非托管注入者(應該加載托管DLL):

#include "stdafx.h"

#include "Injectee.h"

#include "stdafx.h"
#include <stdio.h>
#include "objbase.h"
#include "MSCorEE.h"
#import "C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb" raw_interfaces_only
using namespace mscorlib;

void Bootstrap() {
    CoInitializeEx(0, COINIT_MULTITHREADED );
    ICorRuntimeHost* pICorRuntimeHost = 0;
    HRESULT st = CoCreateInstance(CLSID_CorRuntimeHost, 0, CLSCTX_ALL,
        IID_ICorRuntimeHost, (void**)&pICorRuntimeHost);
    if(!pICorRuntimeHost) {
        MessageBox(NULL, TEXT("Failed at stage 1."), TEXT("Error"), MB_OK); 
    }

    HDOMAINENUM hEnum = NULL;
    pICorRuntimeHost->EnumDomains(&hEnum);

    if(!hEnum) {
        MessageBox(NULL, TEXT("Failed at stage 2."), TEXT("Error"), MB_OK); 
    }

    IUnknown* pUunk = 0;
    st = pICorRuntimeHost->NextDomain(hEnum, &pUunk);
    if(!pUunk) {
        MessageBox(NULL, TEXT("Failed at stage 3."), TEXT("Error"), MB_OK); 
    }

    _AppDomain * pCurDomain = NULL;
    st = pUunk->QueryInterface(__uuidof(_AppDomain), (VOID**)&pCurDomain);
    if(!pCurDomain) {
        MessageBox(NULL, TEXT("Failed at stage 4."), TEXT("Error"), MB_OK); 
    }

    _bstr_t assemblyName = "ZAI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9db2aaea0fceabbb";
    _bstr_t typeName = "Injectee";

    _ObjectHandle* pObjectHandle = 0;

    MessageBox(NULL, TEXT("Loading DLL."), TEXT("Error"), MB_OK); 

    pCurDomain->CreateInstance(assemblyName, typeName, &pObjectHandle);
}

有幫助嗎?

(注意,托管程序集是針對這兩種體系結構構建的(目標應用程序是x64),具有基本命名空間ZAI))

任何建議表示贊賞。

(如果您想知道,我正在嘗試將API添加到免費軟件,閉源.Net應用程序)

我想創建一個新的CorRuntimeHost實例會創建一個新的AppDomain。

我建議編寫一個混合模式的C ++ / CLI DLL並注入它。


如果您確認已獲得對正確AppDomain的引用,請在CreateInstance之前調用AppDomain::Load 或者甚至是AppDomain::ExecuteAssembly ,如果你設置程序集的入口點來做一些有用的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM